前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GDB高级技巧

GDB高级技巧

作者头像
一见
发布2018-08-10 16:56:24
1.4K0
发布2018-08-10 16:56:24
举报
文章被收录于专栏:蓝天蓝天

GDB高级技巧

yijian 2009-2-22

难得有雅兴,边动手边记录操作步骤,本文主要示例一些平常较少使用到的GDB功能,掌握这些用法有助于提高GDB调试和解决问题的能力。

1) 查看宏 默认情况下,在GDB中是不能查看宏的值及定义的,但通过如下方法,则可以达到目的: 编译源代码时,加上“-g3 -gdwarf-2”选项,请注意不是“-g”,必须为“-g3”,查看宏的值使用命令p,这和查看变量的值的方法相同,如果想查看宏的定义,使用“macro expand”命令即可

2) 如果执行一连串命令? 这个借助命令“source”即可,“source”的参数为一个存有一串命令的文件名

3) 如何同时给多个函数打断点? 使用“rb”命令,如果执行“rb”时不带参数,则表示在所有函数处打一个断点,“rb”后面可以接一个符合正则表达式的参数,用来对符合正则表达式的所有函数打断点

4) .gdbinit文件 GDB在启动时,会在用户主目录中寻找这个文件,并执行该文件中所有命令,文件格式为: define command-alias command end 如要给“b main”取一个别名“bm”: define bm b main end 此外,还可以给这个别名加上帮助说明性文字,格式为: document bm 帮助说明性文字 end 如,给“bm”别名添加帮助说明性文字: document bm break at main() function end 这样,在使用“help bm”时,GDB就会打印出“break at main() function”

5) 自定义命令 除了在.gdbinit文件自定义命令外,还可以直接在GDB运行环境定义命令,语法相同

6) 定义命令钩子 钩子用来在执行某个命令前或命令后,先执行某个或某些命令。假如想在print命令前显示一段“----------”,则: define hook-print echo ----------\n end 注意“hook-”后接的必须是命令全称,不能是缩写。 如果想在命令执行完,再执行某个或某些命令,则: #define hookpost-print echo ----------\n end

7) GDB中循环 GDB支持if/else/while/loop_break/loop_continue,如: (gdb) set $x=1 (gdb) while $x==1  >p $x  >set $x=0  >p $x  >end ----------------- b$8 = 1 ----------------- b$9 = 0 maintenance也是个非常强的命令,特别是子命令maintenance translate-address经常用于定位coredump问题。 handle SIGPIPE ignore 表示忽略PIPE信号,进入gdb后,执行“help handle SIGPIPE”可以看到更多用法 set follow-fork-mode child 用于跟踪调试多进程程序,表示fork之后跟踪子进程,而父进程不受影响 set follow-fork-mode parent 表示fork之后继续跟踪父进程,子进程则不受影响,同样可以进入gdb后,执行“set follow-fork-mode”查看说明

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2009-02-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档