、安装gdb,下载地址:http://ftp.gnu.org/gnu/gdb/ ,注意这里的configure命令中的target和host参数,必须和编译器一致
编译gdbserver,在解压缩后的gdb目录下,如果是交叉编译器arm-unknown-linux-gnueabi-gcc,gdbserver的configure中的
--host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
gdb的configure参数--targe=arm-unknown-linux-gnueabi,host不用
2、编译程序,必须加-g参数
3、nfs挂载远程文件目录到本地或是拷贝gdbserver到远程
4、启动gdbserver 格式:gdbserver localhost:端口号 程序名
5、远程调试:gdb -p 程序名
执行远程链接:
(gdb) target remote 远端ip:gdbserver的端口号
开始调试
注意事项:
程序运行如果需要加载动态库,在gdb调试时需要手动加载这些动态库。gbd使用用info share命令查看动态库加载情况
(gdb)info share
手动加载动态库指令:
(gdb) set solib-search-path + 需要加载的动态库路径。
如果每次都要加载相关库可以在~目录下新建一个.gdbinit文件,并将“set solib-search-path + 需要加载的动态库路径”写入其中,gdb每次启动会加载这个配置文件。
常用命令:thread apply all bt //打印所有线程堆栈
info threads //当前所有线程信息
thread ID //切换到置定线程
thread apply ID1 ID2 command //多个线程执行command命令
set scheduler-locking off|on|step off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
show scheduler-locking,查看当前锁定线程的模式
继续使某一线程运行:thread apply 1-n(第几个线程)
查看进程:info inferiors
只运行当前线程
1. 设置:set scheduler-locking on
2. 运行:n
//查看主线程和新线程的关系
pstree -p 主线程id