调用 `cdb.exe` (windbg) 以非交互方式运行,并在崩溃时生成回溯?

Chr*_*eck 6 c++ continuous-integration windbg appveyor

我有一个与 travis-ci 一起使用的 C++ 项目。现在,我使用 boost.build 构建它,在 travis 上,当我运行单元测试时,我通过 来完成它gdb,以便在发生崩溃时获得回溯。

为了以gdb非交互方式执行此操作,我在命令行上像这样调用它:

gdb -return-child-result -batch -ex "run" -ex "thread apply all bt" -ex "quit" --args ./${file}
Run Code Online (Sandbox Code Playgroud)

${file}我的可执行文件在哪里。

这告诉它:

  • 启动进程
  • 适用bt于所有线程,它在发生崩溃时发出回溯,如果没有崩溃也不会执行任何操作。
  • 最后它导致gdb退出,并以孩子的退出代码退出。

现在我想在 appveyor 上做同样的事情。

Boost 构建似乎在 appveyor VM 中完美地开箱即用,因此向他们致敬。

不过,我在努力弄清楚如何配置cdb,控制台表弟windbg。它似乎挂在我的构建日志中。我在网上找到的大多数示例都与检查小型转储文件有关,而不是启动进程并在运行时对其进行调试。

我目前正在这样调用cdb(来自 appveyor powershell 脚本):

cdb -c "$$><cdb_script.txt" -o $file.fullName
Run Code Online (Sandbox Code Playgroud)

我的cdb_script.txt样子

.sympath srv*C:\Windows\Symbols*http://msdl.microsoft.com/download/symbols;
.reload;
~* k 99;
q
Run Code Online (Sandbox Code Playgroud)

我基本上是从我用谷歌搜索的各种东西拼凑起来的,包括

我真的希望找到更好的文档或关于如何具体做到这一点的例子。

我现在得到的错误是:

Microsoft (R) Windows Debugger Version 6.2.9200.20512 X86
Copyright (c) Microsoft Corporation. All rights reserved.
CommandLine: C:\projects\primer\test\stage\api.exe
Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Executable search path is: 
ModLoad: 009a0000 00a27000   api.exe 
ModLoad: 76fb0000 7711f000   ntdll.dll
ModLoad: 76520000 76660000   C:\windows\SysWOW64\KERNEL32.DLL
ModLoad: 75fb0000 76087000   C:\windows\SysWOW64\KERNELBASE.dll
ModLoad: 74350000 743f0000   C:\windows\SysWOW64\apphelp.dll
SHIMVIEW: ShimInfo(Complete)
ModLoad: 73b20000 73bd9000   C:\windows\SysWOW64\MSVCP140D.dll
ModLoad: 741b0000 741cc000   C:\windows\SysWOW64\VCRUNTIME140D.dll
ModLoad: 71bd0000 71d46000   C:\windows\SysWOW64\ucrtbased.dll
(294.49c): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 
eax=00000000 ebx=00000000 ecx=19a00000 edx=00000000 esi=7ecdf000 edi=00000000
eip=77063c7d esp=0110f8d4 ebp=0110f900 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!LdrInitShimEngineDynamic+0x6dd:
77063c7d cc              int     3
0:000> cdb: Reading initial command '><cdb_script.txt'
       ^ Syntax error in '><cdb_script.txt'
Run Code Online (Sandbox Code Playgroud)

我尝试过的一些变化:

  • 使用$$<cdb_script.txt代替$$><cdb_script.txt.
  • 在脚本文件中的最后一个命令后放置一个分号

编辑:我还找到了这个答案,它再次解释了如何使用小型转储进行操作,但更详细地显示了脚本文件。

我真的不知道什么是小型转储 tbh 所以-o选项听起来更有吸引力,至少,更像是gdb. 但是,如果我无法弄清楚这一点,也许我最终会尝试使用小型转储来做到这一点。

Tho*_*ler 2

Powershell 变量的使用$类似于$file.fullName. 这似乎也破坏$$$$><

你可以通过反引号来逃避它,比如

`$`$><cdb_script.txt
Run Code Online (Sandbox Code Playgroud)

以下对我有用:

PS C:\Users\thomas.weller> & "C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\cdb.exe" -c "`$`$><c:\cdb_script.txt" -o notepad.exe
[...]
0:000> cdb: Reading initial command '$$><c:\cdb_script.txt'
Yay!
0:000>
Run Code Online (Sandbox Code Playgroud)