[GDB] 在 gdb 中使用條件式中斷點,條件滿足才中斷

[GDB] 在 gdb 中使用條件式中斷點,條件滿足才中斷

今天在用 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

(本頁面已被瀏覽過 1,027 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料