Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 386, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

gdb远程调试

、安装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

posted on 2018-08-30 16:05 Benjamin 阅读(1960) 评论(0)  编辑 收藏 引用 所属分类: linux


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理