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這個有問題,,原因是我初始化錯了,這個其實是個空指針