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 当然可以,但我不推荐。如果需要更详细地检查异常,最好保留故障转储文件。
我搭建了一部分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 当然可以,但我不推荐。如果需要更详细地检查异常,最好保留故障转储文件。