GDB常用調試命令


gdb 常用命令:
*
【gdb [file]】:進入 gdb 調試環境 / 進入 gdb 調試環境,並加載被調試文件 file
*
【file <file>】:加載被調試文件 file
*
【r [運行時參數]】:r=run,運行被調試程序。如果沒有設置斷點,則運行完整個程序,如果有斷點,運行到第一個斷點處
*
【start】:開始調試,停在第一行代碼處
*
【l [line_number]】:l=list,查看第 1 行附近的源代碼 / 查看第 line_number 行附近的源代碼
*
【b <line_number>】:b=breakpoint,在第 line_number 行設置斷點
*
【b <function>】:讓程序在調用函數時觸發斷點,e.g.【b fun1】。如果希望將斷點設置在 C++ 類的成員函數上,可以使用【類名::函數名】的形式設置斷點,e.g.【b TestClass::testFunc(int)】
*
【i b】:i b=info break,查看所有的斷點信息
*
【d [break_number]】:d=delete,刪除所有斷點 / 刪除編號為 break_number 的斷點
*
【bt】:bt=backtrack,查看棧信息
*
【f <x>】:f=frame,切換到第 x 幀。其中 x 會在【bt】命令中顯示,從 0 開始,0 表示棧頂。
*
【up/down <x>】:往棧頂/棧底移動 x 幀,當省略 x 時默認為 1
*
【condition】:可以在設置的條件成立時,自動停止當前的程序,先使用【b】或者【watch】設置斷點,然后用【condition】來修改這個斷點的停止的條件。e.g.【condition <break_number> <expression>】修改當前斷點的停止條件為 expression 為真值,【condition <break_number>】 清除斷點的停止條件,恢復為一般斷點
*
【ignore <break_number> <count>】:忽略該斷點的前 count 次停止。e.g.【ignore 1 100】忽略斷點1的前100次停止,直到101次程序才停住
*
【s】:s=step,執行一行源程序代碼,如果此行代碼中有函數調用,則進入該函數
*
【finish】:函數結束,【s】進入到函數后,可用該命令跳出被調函數,返回調用函數
*
【n】:n=next,執行一行源程序代碼,不管該行有沒有函數調用
*
【c】:c=continue,繼續執行被調試程序,直至下一個斷點或程序結束
*
【u】:u=until,直到當前循環完成
*
【p <變量名>】:p=print,臨時顯示某個變量
*
【display <變量名>】:跟蹤某個變量,一直顯示
*
【undisplay <已被跟蹤的某個變量編號的編號>】:取消跟蹤某個變量
*
【watch <expression>】:expression 可以是變量、地址、表達式。監視 expression 的值,一旦值有變化,程序停住。取消監視:先用【i b】查看所有斷點信息,其中包含監視 expression,然后【d <expression 的編號>】取消監視
*
【set args <argv1> <argv2> ...】:設置運行時參數
*
【show args】:查看運行時參數
*
【q】:q=quit,退出 gdb 調試環境
*
【help <cmd>】:gdb 幫助命令
*
【回車】:重復上次命令

 

 

 

release的coredump,演示
先切換到崩潰的那幀 【 f  frame_num】

然后disassemble

0x00007fb1850b679f <+319>:   callq  0x7fb18509d670 <_ZNSt18condition_variableC1Ev@plt>
   0x00007fb1850b67a4 <+324>:   mov    0x1c(%rbx),%eax
   0x00007fb1850b67a7 <+327>:   cmpq   $0x0,0x14195c9(%rip)        # 0x7fb1864cfd78
   0x00007fb1850b67af <+335>:   mov    %r15,0xf0(%rsp)
   0x00007fb1850b67b7 <+343>:   movb   $0x0,0x78(%rsp)
   0x00007fb1850b67bc <+348>:   mov    %eax,0x140(%r13)
   0x00007fb1850b67c3 <+355>:   lea    0x141cc76(%rip),%rax        # 0x7fb1864d3440 <_ZL12g_searchMtxN>
   0x00007fb1850b67ca <+362>:   mov    %rax,0x70(%rsp)
   0x00007fb1850b67cf <+367>:   je     0x7fb1850b67e5 <_ZN12GPUIndexFlat18addSearchParam2MemEP13SVIIDPicParamPmPfPj+389>
   0x00007fb1850b67d1 <+369>:   lea    0x141cc68(%rip),%rdi        # 0x7fb1864d3440 <_ZL12g_searchMtxN>
   0x00007fb1850b67d8 <+376>:   callq  0x7fb18509d9b0 <pthread_mutex_lock@plt>
   0x00007fb1850b67dd <+381>:   test   %eax,%eax
   0x00007fb1850b67df <+383>:   jne    0x7fb1850b6bc7 <_ZN12GPUIndexFlat18addSearchParam2MemEP13SVIIDPicParamPmPfPj+1383>
   0x00007fb1850b67e5 <+389>:   mov    0x130(%r13),%rdi
   0x00007fb1850b67ec <+396>:   movb   $0x1,0x78(%rsp)
   0x00007fb1850b67f1 <+401>:   lea    0xb0(%rsp),%rsi
=> 0x00007fb1850b67f9 <+409>:   mov    (%rdi),%rax
   0x00007fb1850b67fc <+412>:   callq  *0x20(%rax)
   0x00007fb1850b67ff <+415>:   lea    0x70(%rsp),%rax
   0x00007fb1850b6804 <+420>:   mov    0x8(%rsp),%rdi
   0x00007fb1850b6809 <+425>:   mov    %rax,%rsi
   0x00007fb1850b680c <+428>:   mov    %rax,0x18(%rsp)
   0x00007fb1850b6811 <+433>:   callq  0x7fb18509e0d0 <_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@plt>
   0x00007fb1850b6816 <+438>:   mov    (%rbx),%r13d
   0x00007fb1850b6819 <+441>:   test   %r13,%r13
   0x00007fb1850b681c <+444>:   je     0x7fb1850b69b3 <_ZN12GPUIndexFlat18addSearchParam2MemEP13SVIIDPicParamPmPfPj+851>


看到匯編不要慫
崩的那個地方 有個這個 => 
 0x00007fb1850b67f9和截圖的pc是一樣的
就是程序計數器,那個東西就是當前程序執行的地址

然后結合代碼callq  *0x20(%rax),,這個應該是調用pThreadPool->enqueue();   
可以確定pThreadPool這個有問題,,原因是我初始化錯了,這個其實是個空指針

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM