[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,032 次)