gdb幾種設置斷點的方式
方式1、根據函數名,查找符號(symbol)設置斷電
此種方式最為簡單,閱讀源代碼,了解函數如何調用,在需要暫停運行的函數入口進行斷點設置。但並不是所有函數,任何時候都能設置斷點的。比如優化后的靜態函數,inline函數。在特定的情況下,通過函數名進行斷點設置便不可為,而又需要查看運行時該函數的運行情況,這時就需要使用第二種方式。
例子:b func_name
方式2、根據代碼行位置設置斷點
當無法通過方式1進行設置斷點,而又明確知道,程序運行到源代碼文件中某個位置需要中斷,則可通過在gdb中指定文件及代碼位置進行斷點設置。通過方式1和2,能解決絕大部分的跟蹤問題,但是,在運行運行中,我們可能會碰到通過函數指針進行函數調用的情況,此時只知道函數指針的地址,就無法通過函數名或者代碼行數進行
例子:b /src/codefile.cc:81。gdb將在運行到源碼文件/src/codefile.cc的第81行中斷
方式3、根據運行時的地址設置斷點
此時有兩種方式,一是通過直接指定地址進行,進行斷點設置。二是通過print命令獲得相關信息
例子1:b *0x5859c0。"*"號是必須加在地址前的,0x5859c0為函數指針的地址
例子2:展示變量內容
(gdb) p *thread_scheduler
$4 = {max_threads = 151, init = 0, init_new_connection_thread = 0x6a3310
<init_new_connection_handler_thread()>,
add_connection = 0x5859c0 <create_thread_to_handle_connection(THD*)>,
thd_wait_begin = 0, thd_wait_end = 0, post_kill_notification = 0,
end_thread = 0x57ea50 <one_thread_per_connection_end(THD*, bool)>, end = 0}
在打印thread_scheduler變量的內容時,保存函數指針的變量add_connection的內容被打印出來,保活函數的指針和函數的名字,通過指針可使用b *0x5859c0進行斷點設置;通過函數名可使用方式1進行斷點設置