6

我有一个与 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

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

我真的希望找到更好的文档或示例来具体说明如何执行此操作。

我现在得到的错误是:

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

4

2 回答 2

2

我最终要做的是:

cdb -y $SymPath -c "|;g;kv;q" -o $file.fullName

使用-y从命令行设置符号路径,我SymPath在我的powershell脚本中设置为一个简单的路径,(我认为)我正在复制pdb文件:

$SymPath = "C:\projects\primer\test\stage"

(我认为那部分实际上并没有工作,我仍然收到一些关于缺少符号的抱怨,但回溯似乎是正确的......)

这些命令记录在ms 页面上的cdbwindbg 下,结果如下:

  • |表示“列出活动进程”,这不是必需的,但会为日志提供一些信息
  • gstart意思是“去” ,它类似于gdb我认为
  • kvbt意思是“详细的回溯” ,它类似于gdb我认为。
  • q意思是“退出”,类似于gdb

我仍然不确定如何获取子退出代码,我可能会将其作为一个单独的问题发布......

于 2016-11-17T11:18:31.270 回答
2

Powershell 变量$$file.fullName. 这似乎也在破坏$$$$><

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

`$`$><cdb_script.txt

以下对我有用:

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>
于 2016-11-17T10:31:10.150 回答