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終了し、子の終了コードで終了します。

今、私は appveor でも同じことをしたいと思います。

ブースト ビルドは、appveyor VM ですぐに使用できるように見えるので、脱帽です。

cdbただし、のコンソールのいとこであるを構成する方法を理解するのに苦労していますwindbg。ビルドログにハングしているようです。私がオンラインで見つけた例のほとんどは、プロセスを開始して実行中にデバッグするのではなく、ミニダンプ ファイルの検査に関係しています。

私は現在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

Powershell 変数は$のように使用し$file.fullNameます。これも in を破壊するよう$$です$$><

次のように、バッククォートでそれをエスケープできます

`$`$><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 に答える
2

私が最終的に仕事に就いたのはこれでした:

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

-yコマンドラインからシンボルパスを設定するために使用しSymPath、powershellスクリプトで単純なパスに設定しています。ここで(私は思う)pdbファイルをコピーしています:

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

(その部分は実際には機能していないと思います。シンボルがないという苦情はまだありますが、それでもバックトレースは正しいようです...)

コマンドは、次の ms ページのcdbwindbg の下に記載されています。

  • |「アクティブなプロセスをリストする」ことを意味します。必須ではありませんが、ログの情報を提供します
  • g「行く」という意味で、に似ているstartgdb思います
  • kvは「詳細なバックトレース」を意味しbt、 inに似ているgdbと思います。
  • qと同様に、「やめる」を意味します。gdb

子終了コードを取得する方法がまだわかりません。別の質問として投稿するかもしれません...

于 2016-11-17T11:18:31.270 に答える