2016-11-17 37 views
3

我有一個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了各種事情,包括

我真的很希望能找到更好的實況或有關如何做到這一點特別的例子。

我得到現在的錯誤是:

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。但是,如果我不能弄明白這一點,也許我最終會試圖用小轉儲來做到這一點。

回答

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> 
+0

我結束了沒有使用cdb腳本,事實證明我的腳本真的沒那麼長,但是感謝這個指針 –

1

我最終得到工作是這樣的:

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

使用-y從命令行設置符號路徑,我設置SymPath在我的PowerShell腳本是一個簡單的路徑,其中,(我認爲)我複製pdb文件:

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

(我認爲這部分是不實際工作,我還得到了一些關於缺少的符號,但投訴但回溯似乎正確的...)

cdb命令下的WinDbg在案the ms page here事實證明:

  • |方式「列表中的活動進程」,這是沒有必要的,但給出了一些信息日誌
  • g意味着「走出去」,這是類似於gdbstart我覺得
  • kv意味着「詳細回溯」,這是類似於btgdb我想。
  • q意味着「退出」,類似於gdb

我仍然不知道如何讓孩子退出代碼,我可能會發布,作爲一個單獨的問題...

+1

我不確定這是否是分析崩潰的非常可靠的方法。請查看LocalDumps註冊表項,在進程崩潰時捕獲崩潰轉儲,並且您將獲得所有需要分析的快照。只是想到在這種情況下「kv」無用的​​堆棧損壞。你的腳本沒有任何內容,但是有一個崩潰轉儲,你仍然可以做一些分析。符號相同:由於您之前忘記了複製它們,您只會有數字。有了崩潰轉儲,您仍然可以修復這些符號。 –

+0

如果你不在美國,我會說我的一個調試課程... –

+0

感謝您的提示,我會盡力閱讀。這只是一個小項目,但我沒有意識到'kv'在堆棧損壞的情況下是無用的。也許'bt'在'gdb'中也沒有用...... ...? –

相關問題