gdb
常用技巧
「已注销」
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
gdb远程调试gdbserver挂起的程序
gdb远程调试原创 2023-01-06 21:39:13 · 1292 阅读 · 0 评论 -
gdb 执行下一条指令,指令级别的调试
gdb 调试汇编原创 2022-11-16 11:05:17 · 720 阅读 · 0 评论 -
gdb 输出指定断点堆栈到文件再进行分析
gdb原创 2022-06-15 09:02:52 · 568 阅读 · 0 评论 -
gdb修改寄存器的值,以修改执行
(gdb) rThe program being debugged has been started already.Start it from the beginning? (y or n) yStarting program: /root/ch/gdb/./a.out Breakpoint 2, 0x0000000000400570 in main () at test.cpp:33 printf("%d\n",__LINE__);(gdb) p $esi=17$14 = 17原创 2022-01-01 17:11:08 · 1425 阅读 · 0 评论 -
gdb调试c++异常,系统调用,库的load,unload,信号异常等.
捕获C++异常格式catch throw [regexp] | catch rethrow [regexp] | catch catch [regexp]说明以正则表达式的方式指定感兴趣的异常.在throw阶段捕获.$_exception获取抛出的什么异常.无参表示捕获所有.局限系统依赖.遵循gnu-v3标准的c++ ABI支持这种断点.案例代码#include<stdio.h>int main(){ try{..原创 2021-08-27 12:48:59 · 665 阅读 · 0 评论 -
gdb查看一段内存数据
x /nfu addrx addrxn可以理解为数组长度.默认1.整数向后,负数向前.f表示输出格式.见 gdb数据输出进制和类型 篇.额外的是i:instruction,输出汇编指令.默认是自动推测.u表示一个数据的大小.b:bytes = 1h:half word = 2w:word = 4默认g:giant word = 8addr表达式,有效地址....原创 2021-04-19 10:49:59 · 1146 阅读 · 0 评论 -
gdb数据输出进制和类型
x:hex十六进制z:zero前置0的十六进制.d:decimal十进制数输出.u:unsigned decimal无符号十进制输出.o:octal八进制输出.t:two二进制输出.a:address地址,输出绝对和相对地址,相对地址以最近符号为基准的偏移量.c字符串处理,类似int i = 0x1234; *(char*)&c;.无法输出的按照八进制的方式输出.f同上,*(float*)&c.输出浮点.s类型是字符串类型就输出,不是就原样输出对应类型数原创 2021-04-19 10:32:23 · 3705 阅读 · 0 评论 -
gdb输出基本类型数组
p (type [num])ptr比如p (char [100])argv[0].原创 2021-04-19 10:18:40 · 313 阅读 · 0 评论 -
gdb下指定调试文件位置
调试信息.编译文件名:gcc -c filename.这里的filename就会被存为文件名.可以用readelf -Wwi | grep DW_AT_name查看.编译位置:即gcc执行时的工作路径.注意是每一个文件都有自己对应的编译绝对路径.说明:代码位置发生变化可执行程序执行所在主机发生了变化.要素:编译文件名:资源搜索目录.资源搜索目录:用于搜索编译文件名的目录.默认值,$cdir:$cwd,这两个都是实时解析,并不是固定值.文件路径生成:1.编译文件名是绝对路径.原创 2021-04-16 14:41:17 · 2714 阅读 · 0 评论 -
gdb三种location,指定位置
一.模糊location,可以被list,break等使用.都是匹配到的具体行.最终都可以转化为数字.linenum当前操作文件的指定行.-offset,+offset声明相对当前的相对偏移.list以上一次输出为基准.break以当前停止的栈帧位置为基准.list的last,则是以第一个参数为基准.filename:filenum文件和位置,相对路径可能有多个匹配,设置断点可能是同时对多个进行设置.所以尽量详细.function匹配函数的声明位置所在行.C++可以是命名空间和函原创 2021-04-16 11:08:27 · 1350 阅读 · 0 评论 -
gdb查看代码list指令
常用list指令:list linenum以当前文件的linenum为中心输出上下若干行的代码.list function以某个函数为中心输出上下若干行的代码.list向下输出list -向上输出.设置list输出行set listsize count # 输出指定数量行,0表示不限制.set listsize unlimited # 输出不限制,和0相同不限制但是会建议分页,因为文件太多可能导致指令窗口溢出.所有list指令:list location指定位置,locat原创 2021-04-16 10:46:19 · 1328 阅读 · 0 评论 -
gdb同时操作多个栈帧
frame apply [all | count | -count | level level...] [option]... command注意,这个是比较新的gdb支持.旧版本不支持.all所有栈帧count最外面的count个.-count最里面的count个.level level...指定编号的栈帧,逗号分隔,可以是单个,多个枚举,区间.options-past-main [on|off]表示main之上的也要设置.-past-main [on|off]隐藏栈帧也要设置。-c原创 2021-04-16 10:19:45 · 132 阅读 · 0 评论 -
gdb查看栈帧信息
f | frame查看当前所在栈,简略版.info f| info frame查看当前的详细版,输出格式如下.栈地址.下一行位置和对应地址.调用者信息.当前栈的语言参数首地址本地变量首地址.上下栈地址信息.存储的寄存器信息.info f framenumber查看某个栈帧的信息.info args [-q]查看当前函数的参数,-q简洁版.info args [-q] [-t type_regexp] [regexp]过滤.info locals [-q]查看本地变量,-原创 2021-04-15 18:41:59 · 544 阅读 · 0 评论 -
gdb选择某个栈帧
frame == ff numberf level number # 新版本可能支持f address stack_ptr # 新版本可能支持f function funcname # 新版本可能支持.f number:选择栈帧.所有栈帧编号可通过bt查看.查看当前栈帧编号通过无参f查看.f:查看当前所在栈.f level number:和f number一样,新版本支持.f address stack_ptr:通过栈地址切换,可通过bt查看,第二列是地址.新版本支持.f原创 2021-04-15 18:28:52 · 1404 阅读 · 0 评论 -
gdb查看调用帧
backtrace [qualifier]... [count]bt [qualifier]... [count]输出当前线程的调用栈.查看其它线程可通过切换或者是thread apply thread-id btqualifier:可选值full输出栈帧的同时输出函数的局部变量信息.count:n最外面的n个栈帧.-n最里面的n个栈帧.其它选项:-past-main [on|off]on输出main还上层的栈帧.off不输出,默认值.where | info s是backtra原创 2021-04-15 17:59:12 · 338 阅读 · 0 评论 -
gdb设置线程绑定断点
break location thread thread-idbreak location thread thread-id if ...thread-id可以设置多个线程.id,id可以通过info threads查看.原创 2021-04-15 14:18:46 · 424 阅读 · 0 评论 -
gdb下next,stepin,stepout
next指令格式next count | n countcount表示在最外层执行count行后停下.遇到函数不会跳转进去.循环也会一次次的执行.until | u是next的加强版,即使是for中也往下跳.不过跳是执行完循环后的结果.但是如果要退出,也会暂停.until location执行到对应地址后停止.如果无法到可能会退出程序或一直执行.stepnext的加强版,可以跳转到函数内部,前提是函数有对应的调试信息.step count重复执行count次 后停止,也会因为断点和原创 2021-04-15 11:52:18 · 2760 阅读 · 0 评论 -
gdb跳出函数
return说明从当前指令直接返回,即不执行后续指令.案例分析chen@chen:~/cppfile/test$ gdb -q ./a.outReading symbols from ./a.out...done.(gdb) b showBreakpoint 1 at 0x4004d6: file test.cpp, line 3.(gdb) rStarting program: /home/chen/cppfile/test/a.outBreakpoint 1..原创 2021-04-15 11:14:56 · 4334 阅读 · 0 评论 -
gdb下恢复执行
continue [ignore-count]c [ignore-count]fg [ignore-count]continue是关键字,可以简写为c.fg,c,continue都样的.ignore-count默认为0,表示忽略当前行对应点的断点ignore-count次.重启了,计次也不变.原创 2021-04-15 10:38:03 · 285 阅读 · 0 评论 -
删除断点
clear删除下一行所在的断点.一般是断点触发了,然后就删除.虽然也可以通过创建临时断点,但是这种更灵活.break mainrclear # 删除main函数的断点clear location删除指定行的断点.`clear [file:](linenum|funcname)``delete [breakpoints] [list...][breakpoints]是可选关键字.list则是断点编号,可以单个,多个枚举,区间.无参所有.简写:d...原创 2021-04-14 18:26:09 · 532 阅读 · 0 评论 -
ssl编译时判断版本
通过宏定义# define OPENSSL_VERSION_NUMBER 0x1010100fL判断.#if OPENSSL_VERSION_NUMBER < 0x1010100fL#else#endif原创 2021-04-12 11:43:35 · 466 阅读 · 0 评论 -
gdb查看进程状态
info program | info proc查看程序状态和查看进程状态.原创 2021-04-11 09:01:46 · 2184 阅读 · 0 评论 -
gdb搜索线程,为线程命名
命名:thread name [newname]为当前线程设置,没有参数则是删除.命名后info threads查看的时候就会看到这个.搜索:thread find [regexp]根据正则表达式搜索线程.一般在线程特别多的时候使用.比如搜索顶层正在执行某个函数的.或着是搜索线程号....原创 2021-04-10 22:17:18 · 698 阅读 · 0 评论 -
gdb对所有线程执行某个指令
指令:thread apply [threadid-list | all [-ascending]] [flags]... command解析:thread apply:表示同时对多个线程进行操作.声明操作集合:[threadid-list | all [-ascending]]可选,无参操作当前线程.threadid-list表示操作的线程集合.all表示操作所有的线程.[-ascending]表示按照线程从小到大的顺序执行.默认是从大到小.标签:flags表示如何处理在执行时遇到的错误原创 2021-04-10 22:09:12 · 306 阅读 · 0 评论 -
gdb调试多线程
提供的功能:线程创建和死亡时输出提示信息.切换调试线程.查看已存在线程对所有或指定线程执行某些gdb指令.设置线程特有断点.自定义线程创建和死亡时的输出.原创 2021-04-10 17:36:02 · 147 阅读 · 0 评论 -
gdb调试多进程
gdb调试的多进程可能是本地可能是远程的.gdb为把每一个进程都视作inferior即下级追踪子进程.虽然大部分都是子进程,但是也有可能是一个任务.inferior在进程之前创建,在进程死之后还存在.绑定正在执行的进程除外.查看当前正在调试的进程info inferiors输出分别是:inferior对应编号;进程号;进程种类,本地还是远程进程,包含连接信息以及对应连接编号;最后是对应可执行程序.当前正在调试的最开头有个*查看当前正在调试的进程inferior查看进程的连接信息inf原创 2021-04-10 14:38:19 · 316 阅读 · 0 评论 -
gdb启动设置调试程序的参数环境变量等
启动程序:r | run.指定可执行文件:gdb program的时候指定,如果没有可以在交互式界面使用file program | exec-file program指定可执行文件.启动时传入参数:r arg1 arg2 arg3 ... | run arg1 arg2 arg3默认用shell对入参进行分词.环境变量: 启动程序是子进程,子进程继承父进程环境变量,所以gdb可以设置环境变量.set environment | unset environment工作目录:set cwd...原创 2021-04-10 10:45:02 · 3760 阅读 · 0 评论 -
编译可gdb调试的程序
添加gcc -g选项.表示添加gdb调试信息.一般信息格式是dwarf格式.这类型的格式会携带一些数据.readelf -Wwi a.out... <c> DW_AT_producer : (indirect string, offset: 0x28): GNU C++ 4.8.5 20150623 (Red Hat 4.8.5-39) -mtune=generic -march=x86-64 -g <10> DW_AT_language原创 2021-04-10 09:29:43 · 367 阅读 · 0 评论 -
gdb输出记录到文件中
将gdb中执行的指令和对应的输出记录下来.set logging on 开启日志模式set logging off关闭日志模式.set logging file filename 设置日志输出位置.set logging overwrite [on | off]输出日志替换操作而不是追加.类似>而不是>>set logging redirect [on | off]输出的内容是终端和日志文件.如果开启了就仅仅输出到日志文件中.show logging查看相关设置.输出文件默认原创 2021-04-10 08:58:56 · 2811 阅读 · 0 评论 -
gdb内的输出用shell处理
pipe gdbcommand | shellcommand | shellcommand...比如pipe p argv[0] | wc低版本的gdb可能不支持.原创 2021-04-09 23:27:07 · 223 阅读 · 0 评论 -
gdb内编译代码
make makeargs比如make all等价于!make all | shell make all原创 2021-04-09 23:23:32 · 94 阅读 · 0 评论 -
gdb内执行shell指令
两种方式,shell command | !command.第一种是用内置指令shell.第二种是用特殊符号!开头.好处就是可以边调试边看源码,甚至进行一些其他操作.!less a.cpp# 查看代码!pwd#查看进来时的工作目录.原创 2021-04-09 23:22:15 · 3184 阅读 · 0 评论 -
退出gdb
gdb不能用ctrl + c退出.而是ctrl + d,这个表示末尾符号.ctrl + c只是终止正在追踪的程序,或者正在执行的指令.常用退出q, quit, q errorcode,quite errorcode,ctrl + d.如果有动态挂在的进程,可以通过detach解除,虽然直接退出也可以解除.如果进来之前就在执行,退出后还是在执行.如果进来之后才执行,退出后就不会继续执行....原创 2021-04-09 23:17:08 · 3035 阅读 · 0 评论 -
gdb将指令放到文本中,避免重复输入
gdb -x filename将进入gdb后交互式命令行后的指令存入到文件.主要适用于重复退出并执行调试的情况.或者是挂着程序调试的情况.比如文件内可以有break maininfo breakpoints启动就设置并执行.原创 2021-04-09 23:08:11 · 197 阅读 · 0 评论 -
gdb进入不输出提示
gdb --silent原创 2021-04-09 21:15:13 · 368 阅读 · 0 评论 -
gdb调试正在执行的程序
指令为gdb program pid或者gdb -p pid.可执行程序/proc/pid/exec就是指向可执行程序的软连接.而这个可调试可执行程序,一般包含有调试信息,记录代码位置.原创 2021-04-09 21:12:10 · 241 阅读 · 0 评论 -
gdb调试指定程序
gdb program然后执行r | run原创 2021-04-09 20:51:40 · 142 阅读 · 0 评论 -
gdb调试core文件
core文件产生的条件是,程序被对应信号杀死.操作系统没有限制ulimit -a查看core的限制.core内容:部分的内存态数据.一般包含堆栈寄存器之类的.调试指令gdb program corenamecore生成名字,一般是pid.core.可以配置....原创 2021-04-09 20:46:41 · 159 阅读 · 0 评论 -
gdb带参数调试程序
gdb --args a.out arg1 arg2--args后的所有字符串都不被看成选项,都作为调试程序的参数.原创 2021-04-09 20:19:58 · 244 阅读 · 0 评论
分享