我有一个与 travis-ci 一起使用的 C++ 项目。现在,我使用 boost.build 构建它,并且在 travis 上,当我运行单元测试时,我通过 来完成它gdb
,以便在发生崩溃时获得回溯。
为了以gdb
非交互方式执行此操作,我在命令行上像这样调用它:
gdb -return-child-result -batch -ex "run" -ex "thread apply all bt" -ex "quit" --args ./${file}
${file}
我的可执行文件在哪里。
这告诉它:
- 开始这个过程
- 适用
bt
于所有线程,它在发生崩溃时发出回溯,如果没有崩溃也不执行任何操作。 - 最后它导致
gdb
退出,并使用孩子的退出代码退出。
现在我想在appveyor上做同样的事情。
Boost build 似乎在 appveyor VM 中开箱即用地完美运行,所以向他们致敬。
但是,我正在努力弄清楚如何cdb
配置windbg
. 它似乎挂在我的构建日志中。我在网上找到的大多数示例都与检查 minidump 文件有关,而不是启动进程并在运行时对其进行调试。
我目前正在cdb
这样调用(来自appveyor powershell脚本):
cdb -c "$$><cdb_script.txt" -o $file.fullName
我的cdb_script.txt
样子
.sympath srv*C:\Windows\Symbols*http://msdl.microsoft.com/download/symbols;
.reload;
~* k 99;
q
我基本上是从我用谷歌搜索的各种东西拼凑起来的,包括
- https://msdn.microsoft.com/en-us/library/windows/hardware/ff560096(v=vs.85).aspx
- http://www.sandboxie.com/index.php?HowToUseWinDbg
我真的希望找到更好的文档或示例来具体说明如何执行此操作。
我现在得到的错误是:
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'
我尝试了一些变化:
- 使用
$$<cdb_script.txt
而不是$$><cdb_script.txt
. - 在脚本文件中的最后一个命令后放置一个分号
编辑:我也找到了这个答案,它再次解释了如何使用小型转储,但更详细地显示了脚本文件。
我真的不知道什么是小型转储,所以-o
选项听起来更有吸引力,至少,更像gdb
. 但是,如果我无法弄清楚这一点,也许我最终会尝试使用小型转储来做到这一点。