Windows:在CI测试期间出现coredump时打印stacktrace

Windows:在CI测试期间出现coredump时打印stacktrace,windows,windbg,gitlab-ci,stack-trace,windows-error-reporting,Windows,Windbg,Gitlab Ci,Stack Trace,Windows Error Reporting,我已经建立了我公司Gitlab CI持续集成系统的一部分。 我们每晚在所有平台上运行构建和测试。 我设法打印stacktrace,以防Linux和MacOS进程崩溃(分别使用GDB和LLDB)。 我正在尝试在Windows上也这么做,但我还没有找到如何 堆芯转储生成 如前所述,我首先尝试启用Windows错误报告。它与默认设置一起工作,但我更喜欢在可执行目录中生成CoreDump 我尝试将“%CD%”放在DumpFolder键中(键入REG_EXPAND_SZ,我选中了),但它不起作用。。。 我

我已经建立了我公司Gitlab CI持续集成系统的一部分。 我们每晚在所有平台上运行构建和测试。 我设法打印stacktrace,以防Linux和MacOS进程崩溃(分别使用GDB和LLDB)。 我正在尝试在Windows上也这么做,但我还没有找到如何

堆芯转储生成

如前所述,我首先尝试启用Windows错误报告。它与默认设置一起工作,但我更喜欢在可执行目录中生成CoreDump

我尝试将“%CD%”放在DumpFolder键中(键入REG_EXPAND_SZ,我选中了),但它不起作用。。。 我现在正试图了解如何用WinDbg生成coredump,但我仍然不知道如何生成

堆栈跟踪显示

当coredump将在正确的文件夹中生成时,我需要弄清楚如何打印stacktrace。。。你已经知道这个命令了吗(这对我来说是强制性的)

powershell脚本或基本命令都应该正常

编辑:


我可以用windbg在本地很容易地打印生成的coredump的堆栈跟踪。但是,由于某种原因,当Gitlab CI触发作业时,不会生成coredump。。。是否有任何未记录的值添加到Windows错误报告键以生成CoreDump,即使错误程序是通过Gitlab CI启动的?(如果我通过SSH启动它,它会工作)

%cd%我认为会扩展到windbg启动的目录,而不是可执行文件所在的目录

我不认为你可以要求任何通用工具转储到任意目录

要使用windbg/cdb/kd创建转储,请在windbg安装文件夹中签出adplus(读取adplus.doc)

它接受-O参数,但这是一个目录,而不是多个任意目录

无论如何,前提是您在所选目录中创建了.dmp文件

打印调用堆栈只需在windbg中加载转储并发出即可完成 kb命令

假设您不想查看所有加载内容,那么您可以在powershell中运行正则表达式匹配

F:\>dir /s /b *.dmp
F:\mydmp.dmp

F:\>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS F:\> $foo = cdb -c "kb;q" -z .\mydmp.dmp
PS F:\> $pattern = "Reading(.*?)quit:"
PS F:\> [regex]::Match($foo,$pattern)


Groups   : {0, 1}
Success  : True
Name     : 0
Captures : {0}
Index    : 1033
Length   : 761
Value    : Reading initial command 'kb;q' RetAddr           : Args to Child
                : Call Site 00007fff`46466246 : 00000000`00000000 00007fff`464bd100 00007fff`464bd100 00007fff`464bd100 :
           ntdll!LdrpDoDebuggerBreak+0x30 00007fff`46453879 : 00000000`00000001 00000000`00000000 00000000`00000000
           00000000`00000001 : ntdll!LdrpInitializeProcess+0x1d92 00007fff`464056c3 : 00000000`00000000 00007fff`46390000
           00000000`00000000 00000041`08a21000 : ntdll!_LdrpInitialize+0x4e19d 00007fff`4640566e : 00000041`08cff780
           00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrpInitialize+0x3b 00000000`00000000 :
           00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe quit:



PS F:\> exit

F:\>

%cd%我认为会扩展到windbg启动的目录,而不是可执行文件所在的目录

我不认为你可以要求任何通用工具转储到任意目录

要使用windbg/cdb/kd创建转储,请在windbg安装文件夹中签出adplus(读取adplus.doc)

它接受-O参数,但这是一个目录,而不是多个任意目录

无论如何,前提是您在所选目录中创建了.dmp文件

打印调用堆栈只需在windbg中加载转储并发出即可完成 kb命令

假设您不想查看所有加载内容,那么您可以在powershell中运行正则表达式匹配

F:\>dir /s /b *.dmp
F:\mydmp.dmp

F:\>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS F:\> $foo = cdb -c "kb;q" -z .\mydmp.dmp
PS F:\> $pattern = "Reading(.*?)quit:"
PS F:\> [regex]::Match($foo,$pattern)


Groups   : {0, 1}
Success  : True
Name     : 0
Captures : {0}
Index    : 1033
Length   : 761
Value    : Reading initial command 'kb;q' RetAddr           : Args to Child
                : Call Site 00007fff`46466246 : 00000000`00000000 00007fff`464bd100 00007fff`464bd100 00007fff`464bd100 :
           ntdll!LdrpDoDebuggerBreak+0x30 00007fff`46453879 : 00000000`00000001 00000000`00000000 00000000`00000000
           00000000`00000001 : ntdll!LdrpInitializeProcess+0x1d92 00007fff`464056c3 : 00000000`00000000 00007fff`46390000
           00000000`00000000 00000041`08a21000 : ntdll!_LdrpInitialize+0x4e19d 00007fff`4640566e : 00000041`08cff780
           00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrpInitialize+0x3b 00000000`00000000 :
           00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe quit:



PS F:\> exit

F:\>

我怀疑
%CD%
在这种情况下是否有效<代码>%CD%可能会扩展到正在读取注册表项的进程的当前目录。该目录与可执行文件的目录不同

看一看。
-x
命令行选项允许您指定放置崩溃转储文件的目录

以下是对我有效的方法:

..\procdump.exe  -e -x . SimpleCppCrash.exe -arg1 -arg2 -arg3
我可以在崩溃转储中验证:

0:000> !peb
[...]
CommandLine:  '"SimpleCppCrash.exe"  -arg1 -arg2 -arg3'
[...]
因此,可执行文件传递了参数

剩下的问题已经由@blabb:use
cdb-c;q“
回答了,如果您想要持久化,可以使用
-logo
选项


单独使用WinDbg/cdb当然是可能的,但我不推荐这样做。如果需要更详细地检查异常,最好还是保留崩溃转储文件。

我怀疑
%CD%
在这种情况下是否有效<代码>%CD%可能会扩展到正在读取注册表项的进程的当前目录。该目录与可执行文件的目录不同

看一看。
-x
命令行选项允许您指定放置崩溃转储文件的目录

以下是对我有效的方法:

..\procdump.exe  -e -x . SimpleCppCrash.exe -arg1 -arg2 -arg3
我可以在崩溃转储中验证:

0:000> !peb
[...]
CommandLine:  '"SimpleCppCrash.exe"  -arg1 -arg2 -arg3'
[...]
因此,可执行文件传递了参数

剩下的问题已经由@blabb:use
cdb-c;q“
回答了,如果您想要持久化,可以使用
-logo
选项


单独使用WinDbg/cdb当然是可能的,但我不推荐这样做。如果需要更详细地检查异常,最好仍然保留崩溃转储文件。

我尝试使用ProcDump,但经过一些研究,我没有找到如何为崩溃测试仪提供参数。提供参数是强制性的,因为如果参数不存在,测试人员将不会启动。我尝试了以下命令(在安装procdump并将其添加到我的路径后):procdump-ma-e-x%CD%my_tester--arg1--arg2我还尝试了用引号转义参数,或者给procdump要启动的程序和用引号括起来的参数,但procdump似乎只是忽略了exe参数。。。你知道怎么做吗?@Kyron:我怀疑使用
%CD%
是否有用,我不知道在哪种情况下
%CD%
会比我使用的
更有用。\procdump.exe-e-x。SimpleCppCrash.exe-arg1-arg2-arg3,并将参数传递给可执行文件。看到更新的答案你是对的,我只是在我的命令中犯了一个错误。。。谢谢我尝试使用ProcDump,但经过一些研究,我没有找到如何为崩溃测试仪提供参数。提供参数是强制性的,因为如果参数不存在,测试人员将不会启动。我尝试了以下命令(在安装procdump并将其添加到我的路径后):procdump-ma-e-x%CD%my_tester--arg1--arg2我还尝试了用引号转义参数,或者将要启动的程序和他的