Windows :在 CI 测试期间出现核心转储时打印堆栈跟踪

Windows : Print stacktrace in case of a coredump during CI testing

我搭建了一部分Gitlab-CI我公司的持续集成系统。 我们 运行 每晚在所有平台上构建和测试。 在 Linux 和 MacOS(分别使用 GDB 和 LLDB)的崩溃过程中,我设法打印了堆栈跟踪。 我也在为 Windows 尝试这样做,但我还没有找到如何...

核心转储生成

我首先尝试启用 Windows 错误报告,如 in the documentation 所述。它使用默认设置,但我更喜欢在可执行目录中生成核心转储...

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

堆栈跟踪显示

当在正确的文件夹中生成 coredump 时,我需要弄清楚如何打印堆栈跟踪...您是否已经知道用于此的命令(这对我来说是强制性的)?

powershell 脚本或基本命令都应该没问题。

编辑:

我可以很容易地在本地使用 windbg 打印生成的 coredump 的堆栈跟踪。但是,由于某种原因,当作业被 Gitlab-CI 触发时,不会生成核心转储...是否有任何未记录的值添加到 Windows 错误报告键以生成核心转储即使错误程序是通过 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% 在这种情况下是否有效。 %CD% 可能会扩展到正在读取注册表项的进程的当前目录。这与您的可执行文件的目录不同。

看看ProcDump-x 命令行选项可让您指定放置故障转储文件的目录。

以下是适合我的方法:

..\procdump.exe  -e -x . SimpleCppCrash.exe -arg1 -arg2 -arg3

我可以在故障转储中验证:

0:000> !peb
[...]
CommandLine:  '"SimpleCppCrash.exe"  -arg1 -arg2 -arg3'
[...]

因此,可执行文件已传递参数。

@blabb 已经回答了其余部分:使用 cdb -c "<whatever>;q",如果你希望它持久化,可以使用 -logo <logfile> 选项。

单独使用 WinDbg/cdb 当然可以,但我不推荐。如果需要更详细地检查异常,最好保留故障转储文件。