gdb几种设置断点的方式
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进行断点设置