我有一個C++項目,我用travis-ci。現在,我使用boost.build構建它,在travis上,當我運行單元測試時,我通過gdb
來完成它,以便在發生崩潰時進行回溯。調用`cdb.exe`(windbg)以非交互方式運行,並在崩潰的情況下產生回溯?
爲了使gdb
做到這一點非交互,我調用它像這樣的命令行:
gdb -return-child-result -batch -ex "run" -ex "thread apply all bt" -ex "quit" --args ./${file}
其中${file}
是我的可執行文件。
這它告訴給:
- 啓動過程
- 適用
bt
所有線程,其發出的碰撞事件回溯,也什麼都不做,如果沒有崩潰。 - 最後它會導致
gdb
退出,並退出該子女的退出代碼。現在
我願做appveyor同樣的事情。
Boost構建似乎在appveyor虛擬機中可以完美的工作,所以對他們不利。
但是,我正在努力弄清楚如何配置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
我基本上補鞋這一起從我GOOGLE了各種事情,包括
- 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
。 - 腳本文件放置一個分號最後一個命令後
編輯:我也this answer發現,這又說明了如何使用小型轉儲做,但詳細顯示腳本文件。
我真的不知道什麼是小轉儲是tbh所以-o
選項聽起來更有吸引力,至少更像gdb
。但是,如果我不能弄明白這一點,也許我最終會試圖用小轉儲來做到這一點。
我結束了沒有使用cdb腳本,事實證明我的腳本真的沒那麼長,但是感謝這個指針 –