今天在用 gdb 研究 lib7zip 的程式流程,

不過在迴圈裡面設定中斷點的話有點麻煩,每次迴圈都會中斷,

而我只想在某個條件滿足時才中斷就好了...

 

這時就可以用 gdb 的條件式中斷點 (conditional breakpoint) 功能了,

只要在中斷點後加上 if <condition> 就行了~

像是我想要在程式跑到第 93 行時,

如果 pInfo->m_Name 的內容是 L"PE" 的時候才中斷,就可以這麼下:

(gdb) b 93 if wcscmp(pInfo->m_Name.c_str(), L"PE") == 0
Breakpoint 3 at 0x7ffff7bcb71e: file 7ZipOpenArchive.cpp, line 93.

 

當條件滿足時,就會停在中斷點:

(gdb) c
Continuing.

Breakpoint 3, CreateInArchive (pFunctions=0xb8b880, formatInfos=..., inStream=..., ext=L"", archive=..., fCheckFileTypeBySignature=true) at 7ZipOpenArchive.cpp:93
93	    if (!fCheckFileTypeBySignature) {

 

檢查一下現在的 pInfo->m_Name,果然內容確實是 L"PE" 囉:

(gdb) p pInfo->m_Name
$5 = L"PE"

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00007ffff7bcb6c9 in CreateInArchive(pU7ZipFunctions, C7ZipObjectPtrArray const&, CMyComPtr<IInStream>&, wstring, CMyComPtr<IInArchive>&, bool) 
                                                   at 7ZipOpenArchive.cpp:88
	breakpoint already hit 1 time
3       breakpoint     keep y   0x00007ffff7bcb71e in CreateInArchive(pU7ZipFunctions, C7ZipObjectPtrArray const&, CMyComPtr<IInStream>&, wstring, CMyComPtr<IInArchive>&, bool) 
                                                   at 7ZipOpenArchive.cpp:93
	stop only if wcscmp(pInfo->m_Name.c_str(), L"PE") == 0
	breakpoint already hit 1 time

 

參考資料:GDB: break if variable equal value

文章標籤
創作者介紹

亂打一通的心情日記

ephrain 發表在 痞客邦 PIXNET 留言(0) 人氣()