gdb命令调试技巧
gdb命令调试技巧
一、信息显示
1、显示gdb版本 (gdb) show version
2、显示gdb版权 (gdb) show version or show warranty
3、启动时不显示提示信息gdb -q exe 或者.bashrc 添加alias gdb="gdb -q",重启shell
4、退出时不显示提示信息(gdb) set confirm off
5、输出信息多时不会暂停输出(gdb)set pagination off
二、函数
1、列出函数的名字(gdb) info functions
2、是否进入待调试信息的函数(gdb)step s
3、进入不带调试信息的函数(gdb)set step-mode on
4、退出正在调试的函数(gdb)return expression 或者 (gdb)finish
5、直接执行函数(gdb)start 函数名 call函数名
6、打印函数堆栈帧信息(gdb)info frame or i frame
7、查看函数寄存器信息(gdb)i registers
8、查看函数反汇编代码(gdb)disassemble func
9、打印尾调用堆栈帧信息(gdb)set debug entry-values 1
10、选择函数堆栈帧(gdb)frame n
11、向上或向下切换函数堆栈帧(gdb)up n down n
三、断点
1、在匿名空间设置断点(gdb)b Foo::foo (gdb) b (anonymous namespace)::bar
2、在程序地址上打断点(gdb)b *address (gdb) b *0x400522
3、在程序入口处打断点$strip a.out $readelf -h a.out或者(gdb)info files定位Entry point: 0x400440 (gdb)b *0x400440
4、在文件行号上打断点(gdb)b linenum (gdb)b file.cpp:linenum (gdb)info breakpoints
5、保存已经设置的断点(gdb)save breakpoints file-breakpoints-to-save (gdb)source file-breakpoints-to-save
6、设置临时断点(gdb)tbreak linenum
7、设置条件断点(gdb)b linenum if cond b 11 if i==10
8、忽略断点(gdb)ignore bnum count
四、观察点
1、设置观察点(gdb)watch a wacth *(type*)adress info watchpoints disable、enable、delete
2、设置观察点只针对特定线程生效(gdb)info threads watch expr thread threadnum wa a thread 2
3、设置读观察点(gdb)rwatch
4、设置读写观察点(gdb)awacth
五、Catchpoint
1、让catchpoint只触发一次(gdb)tcatch
2、为fork调用设置catchpoint (gdb)catch fork
3、为vfork调用设置catchpoint (gdb)catch vfork
4、为exec调用设置catchpoint (gdb)catch exec
5、为系统调用设置catchpoint (gdb)catch syscall name or num
6、通过ptrace调用设置catchpoint破解anti-debugging的程序 (gdb)catch syscall ptrace set $rax=0
六、打印
1、打印ASCII和宽字符字符串 (gdb)x/s str x/ws 4_wstr x/hs 2_wstr
2、打印STL容器中的内容 (gdb)p vec
3、打印大数组中的内容 (gdb)set print elements number-of-elements set print elements 0 or set print elements unlimited
4、打印数组中任意连续的元素值(gdb)p array[index]@num
5、打印数组的索引下标(gdb)set print array-indexes on
6、打印函数局部变量的值(gdb)bt full info locals
7、打印进程的内存信息(gdb)i proc mappings i files
8、打印静态变量的值(gdb)p 'static-1.c'::var
9、打印变量的类型和所在文件(gdb)whatis he ptype he i variables he
10、打印内存的值(gdb)16进制 x/16xb a 10进制x/16ub a 二进制x/16tb a
11、打印源代码行(gdb)l line l 函数 l - l + l 1,10
12、每行打印一个结构体成员(gdb)set print pretty on
13、按照派生类打印对象(gdb)set print object on
14、指定程序的输入输出设备(gdb)tty gdb -tty /dev/pts/2 ./a.out tty /dev/pts/2
15、使用"$\\_"和"$\\__"变量(gdb) x "命令会把最后检查的内存地址值存在“ $_ ”这个“convenience variable”中,并
且会把这个地址中的内容放在“ $__ ”这个“convenience variable”
16、打印程序动态分配内存的信息(gdb)define mallocinfo set $__f = fopen("/dev/tty", "w") call malloc_info(0, $__f)call fclose($__f)end mallocinfo
17、打印调用栈帧中变量的值(gdb)b func_1 r bt f 1 p b f 2 p b p func2::b p func_3::b
七、多进程/线程
1、调试已经运行的进程gdb program -p=10210 (gdb)attach pid detach
2、调试子进程(gdb)set follow-fork-mode child
3、同时调试父进程和子进程(gdb)set detach-on-fork off i inferiors set schedule-multiple on
4、查看线程信息(gdb)i threads
5、在Solaris上使用maintenance命令查看线程信息(gdb)maint info sol-threads
6、不显示线程启动和退出信息(gdb)set print thread-events off
7、只允许一个线程运行(gdb)set scheduler-locking on
8、使用"$_thread"变量(gdb)command 2Type commands for breakpoint(s) 2, one per line.End with a line saying just "end".>printf "thread id=%d\n", $_thread >end
9、一个gdb会话中同时调试多个程序(gdb)add-inferior [ -copies n ] [ -exec executable ]
10、打印程序进程空间信息(gdb)maint info program-spaces
11、使用"$_exitcode"变量(gdb)p $_exitcode
八、core dump文件
1、为调试进程产生core dump文件(gdb)generate-core-file or gcore
2、加载可执行程序和core dump文件(gdb)gdb -q /data/nan/a /var/core/core.a.22268.1402638140
九、汇编
1、设置汇编指令格式(gdb)set disassembly-flavor intel disassemble main
2、在函数的第一条汇编指令打断点(gdb)b *main
3、自动反汇编后面要执行的代码(gdb)set disassemble-next-line on set disassemble-next-line auto set disassemble-next-line off
4、将源程序和汇编指令映射起来(gdb)disas /m main
5、显示将要执行的汇编指令(gdb)display /i $pc
6、打印寄存器的值(gdb)i registers i all-registers i registers eax
7、显示程序原始机器码(gdb)disassemble /r main
十、改变程序执行顺序
1、改变字符串的值(gdb)set main::p1="Jil"
2、设置变量的值(gdb)set var variable=expr set var i = 8 set {int}0x8047a54 = 8 set var $eax = 8
3、修改PC寄存器的值(gdb)p $pc set var $pc=0x08050949
4、跳转到指定位置执行(gdb)j 15
5、使用断点命令改变程序的执行(gdb)(gdb) b drawing Breakpoint 1 at 0x40064d: file win.c, line 6.
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>silent
>set variable n = 0
>continue
>end
(gdb) r
6、修改被调试程序的二进制文件gdb -write ./a.out (gdb)show write set write on disassemble /mr drawing set variable *(short*)0x400651=0x0ceb disassemble /mr drawing
十一、信号
1、查看信号处理信息(gdb)i signals
2、信号发生时是否暂停程序(gdb) handle signal stop/nostop
3、信号发生时是否打印信号信息(gdb)handle signal print/noprint
4、信号发生时是否把信息丢给程序处理(gdb)handle signal pass(noignore)/nopass(ignore)
5、给程序发送信息(gdb)signal signal_name
6、使用"$_siginfo"变量(gdb)ptype $_siginfo
十二、共享库
1、显示共享连接库信息(gdb)info sharedlibrary regex
十三、脚本
1、配置gdb init文件(gdb) home目录下的 .gdbinit
2、按何种方式解析脚本文件(gdb)set script-extension off soft strict
3、保存历史命令(gdb)set history filename ~/.gdb_history set history save on
十四、源文件
1、设置源文件查找路径(gdb)directory ../ki/
2、替换查找源文件的目录(gdb)set substitute-path from to
十五、图形化界面
1、进入和退出图形化调试界面(gdb)gdb -tui program
2、显示汇编代码窗口(gdb)layout asm
3、显示寄存器窗口(gdb)layout regs
4、调整窗口大小(gdb)winheight <win_name> [+ | -]count
十六、其它
1、命令行选项的格式(gdb)gdb -help
2、支持预处理器宏信息(gdb)gcc -g3
3、使用命令的缩写形式(gdb)b -> break
c -> continue
d -> delete
f -> frame
i -> info
j -> jump
l -> list
n -> next
p -> print
r -> run
s -> step
u -> until
aw -> awatch
bt -> backtrace
dir -> directory
disas -> disassemble
fin -> finish
ig -> ignore
ni -> nexti
rw -> rwatch
si -> stepi
tb -> tbreak
wa -> watch
win -> winheight
4、在gdb中执行shell命令和make(gdb)shell ls
5、在gdb中执行cd和pwd命令(gdb)pwd cd tmp
6、设置命令提示符(gdb)gdb -q `which gdb
7、设置被调试程序的参数(gdb)gdb -args ./a.out a b c set args a b c r a b
8、设置被调试程序的环境变量(gdb)set env varname=value
9、得到命令的帮助信息(gdb)help
10、记录执行gdb的过程(gdb)set logging file log.txt set logging on
gdb命令调试技巧的更多相关文章
- 第09课:GDB 实用调试技巧(下)
本节课的核心内容: 多线程下禁止线程切换 条件断点 使用 GDB 调试多进程程序 多线程下禁止线程切换 假设现在有 5 个线程,除了主线程,工作线程都是下面这样的一个函数: void thread_p ...
- 第08课:GDB 实用调试技巧( 上)
本节课的核心内容: 将 print 打印结果显示完整 让被 GDB 调试的程序接收信号 函数明明存在,添加断点时却无效 将 print 打印结果显示完整 当使用 print 命令打印一个字符串或者字符 ...
- gdb各种调试命令和技巧
陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...
- 【转贴】gdb中的信号(signal)相关调试技巧
一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛 http://www.magicunix.com/index_ch.html http://www.m ...
- GDB调试技巧:总结篇
目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...
- pwn 题GDB调试技巧和exp模板
GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直 ...
- 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程
GDB的那些奇淫技巧 evilpan 收录于 Security 2020-09-13 约 5433 字 预计阅读 11 分钟 709 次阅读 gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...
- gdb常用调试命令
一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) ...
- Xcode 调试技巧 --常用命令和断点
Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令.而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧. ...
随机推荐
- openresty+lua劫持请求,有点意思
0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了一些邪恶的东西:反代既然是所有流量走我的服务器,那我是不是能够在中途做些手脚,达到一些有趣的目的. op ...
- Android项目中的换肤总结
纵观现在各种Android app,其换肤需求可以归为 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,UI表现为一个switcher. 多种主题切换,通常为会员特权,如Q ...
- 用DataRelation给多个DataTable建立关系并显示到TreeView
DataRelation 对象执行两种功能: 它可使与正使用的记录相关的记录可用.如果在父记录 (GetChildRows) 中,则它提供子记录:如果正使用子记录 (GetParentRow),则它提 ...
- Linux以百万兆字节显示内存大小
Linux以百万兆字节显示内存大小 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free --tera total used free shared buf ...
- C# MVC的一种高效分页的html方法
首先创建一个html的扩展方法,这个方法是万能的,可以直接拿到您的项目中使用: //主要就是输出分页的超级链接的标签 //自定义分页Helper扩展 public static HtmlString ...
- Java并发编程笔记4-线程池
我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线 ...
- @postconstruct初始化的操作
从Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion):@PostConstruct和@PreDestroy.这两个注解被用来修饰一个非静态的vo ...
- monkey日志分析
Monkey测试的og分析,我们可以通过几个关键词来判断测试是否通过.1)Monkey finished打开LOG,查看log的最下端,是否有类似以下字段:## Network stats: elap ...
- C#图解教程 第十三章 委托
委托 什么是委托委托概述声明委托类型创建委托对象给委托赋值组合委托为委托添加方法从委托移除方法调用委托委托示例调用带返回值的委托调用带引用参数的委托匿名方法 使用匿名方法匿名方法的语法 Lambda ...
- Spring AOP介绍
1.介绍 AOP(面向切面编程)对OOP(面向对象编程)是一种补充,它提供了另一种程序结构的思路.OOP的模块单元是class,而AOP的模块单元是aspect.Spring中一个关键的组件是AOP框 ...