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. 但是,如果我无法弄清楚这一点,也许我最终会尝试使用小型转储来做到这一点。
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)