![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
gdb
常用技巧
502203305
不积跬步,无以至千里;
不积小流,无以成江海。
展开
-
gdb 调试汇编
从第一条指令开始执行并停止.原创 2023-08-09 21:54:43 · 800 阅读 · 0 评论 -
C/C++ 预处理结果分析,代码分析
即外部参数, 一般是外部传入宏定义;原创 2023-07-22 12:00:58 · 98 阅读 · 0 评论 -
gdb远程调试gdbserver挂起的程序
gdb远程调试原创 2023-01-06 21:39:13 · 1110 阅读 · 0 评论 -
gdb 执行下一条指令,指令级别的调试
gdb 调试汇编原创 2022-11-16 11:05:17 · 442 阅读 · 0 评论 -
gdb 输出指定断点堆栈到文件再进行分析
gdb原创 2022-06-15 09:02:52 · 374 阅读 · 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 · 1263 阅读 · 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 · 440 阅读 · 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 · 979 阅读 · 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 · 2672 阅读 · 0 评论 -
gdb输出基本类型数组
p (type [num])ptr比如p (char [100])argv[0].原创 2021-04-19 10:18:40 · 230 阅读 · 0 评论 -
gdb下指定调试文件位置
调试信息.编译文件名:gcc -c filename.这里的filename就会被存为文件名.可以用readelf -Wwi | grep DW_AT_name查看.编译位置:即gcc执行时的工作路径.注意是每一个文件都有自己对应的编译绝对路径.说明:代码位置发生变化可执行程序执行所在主机发生了变化.要素:编译文件名:资源搜索目录.资源搜索目录:用于搜索编译文件名的目录.默认值,$cdir:$cwd,这两个都是实时解析,并不是固定值.文件路径生成:1.编译文件名是绝对路径.原创 2021-04-16 14:41:17 · 2355 阅读 · 0 评论 -
gdb三种location,指定位置
一.模糊location,可以被list,break等使用.都是匹配到的具体行.最终都可以转化为数字.linenum当前操作文件的指定行.-offset,+offset声明相对当前的相对偏移.list以上一次输出为基准.break以当前停止的栈帧位置为基准.list的last,则是以第一个参数为基准.filename:filenum文件和位置,相对路径可能有多个匹配,设置断点可能是同时对多个进行设置.所以尽量详细.function匹配函数的声明位置所在行.C++可以是命名空间和函原创 2021-04-16 11:08:27 · 987 阅读 · 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 · 998 阅读 · 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 · 72 阅读 · 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 · 395 阅读 · 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 · 1115 阅读 · 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 · 216 阅读 · 0 评论 -
gdb设置线程绑定断点
break location thread thread-idbreak location thread thread-id if ...thread-id可以设置多个线程.id,id可以通过info threads查看.原创 2021-04-15 14:18:46 · 328 阅读 · 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 · 2403 阅读 · 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 · 3814 阅读 · 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 · 206 阅读 · 0 评论 -
gdb事件断点,系统调用,共享库加载写在,异常和信号
抛出异常行为.catch (throw | rethrow | catch ) [regex]捕获C++的三种异常行为,regex表示捕获类型正则,没有就是所有.catch syscall [name|number|group:name|g:name]调用系统的地方设置断点,即应用中断.以name的方式声明.比如catch syscall open以number的方式声明catch syscall 1这种可操作型更强,因为很多的系统调用都没有函数名.group:name分组,gdb对系原创 2021-04-14 22:27:34 · 393 阅读 · 0 评论 -
gdb给指定断点条件指令
功能:在断点触发后立即执行指令.使用,可以用于在触发后输出对应的并继续.commands [list...]... command-list ...endlist表示断点集合.无list表示给最新设置的断点添加.有就是指定.command-list就是gdb指令.end表示末尾.添加上面的格式.删除就是无command-list.案例:commands 1 2silentecho okp icend...原创 2021-04-14 19:05:51 · 176 阅读 · 0 评论 -
gdb给指定断点添加触发条件
condition bnum expressionbnum断点编号.expression条件表达式.和语言相关,gdb检测合法性.条件为真的时候才触发对应断点.condition bnum清理ignore bnum count前n次触发忽略.原创 2021-04-14 19:02:03 · 359 阅读 · 0 评论 -
gdb禁用启用断点
启用enable [breakpoints] [list...]breakpoints是关键字,可有可无.list是断点编号.无参启用所有.禁用disable [breakpoints] [list...]同上,相反是禁用.无参禁用所有.简写diss,dis启用一次,触发后禁用.enable [breakpoints] once list...对若干断点启用list是断点集合.单个,多个枚举,范围.启用若干次.enable [breakpoints] count count li原创 2021-04-14 18:43:31 · 567 阅读 · 0 评论 -
删除断点
clear删除下一行所在的断点.一般是断点触发了,然后就删除.虽然也可以通过创建临时断点,但是这种更灵活.break mainrclear # 删除main函数的断点clear location删除指定行的断点.`clear [file:](linenum|funcname)``delete [breakpoints] [list...][breakpoints]是可选关键字.list则是断点编号,可以单个,多个枚举,区间.无参所有.简写:d...原创 2021-04-14 18:26:09 · 392 阅读 · 0 评论 -
gdb观测断点细节
使用常量创建不行.需要是变量的方式.相当于auto name = expr value对这个临时变量name进行监测,因为内部有符号映射,知道name与地址的映射.gdb对常量监测会失败.硬件检测和软件检测.硬件检测执行就非常快,指令对其有操作之后就进行中断.指令级别的支持.软件检测一行代码执行完了之后就执行一下表达式求值.非指令级别.更慢.强制硬件断点.set can-use-hwwatchpoints [0|1]0不可以,之前设置的硬件断点不影响.1可以.show can-use-原创 2021-04-13 08:24:41 · 110 阅读 · 0 评论 -
gdb监测断点,表达式是否发生变化
功能:当表达式的值发生变化时,停止.对一个表达式进行监测,不用预期在那儿发生了变化.也就是说这种就是为了监测某个变量或着某个地址的数据发生了变化.复杂和简单:简单的就是一个变量,复杂的就是一个复杂的表达式。比如:监测某个变量,监测某个地址的值可以*(int*)0xafdfaadf或者复杂的表达式a*b-c/d;在设置的时候,表达式不合法怎么处理.gdb会在 不合法的表达式变成合法的时候 停止.如果一个表达式从不合法变成是通过另类的途径,而不是赋值的方式,那么gdb就很有可能监测不出来.只有第二原创 2021-04-12 23:16:27 · 456 阅读 · 0 评论 -
ssl编译时判断版本
通过宏定义# define OPENSSL_VERSION_NUMBER 0x1010100fL判断.#if OPENSSL_VERSION_NUMBER < 0x1010100fL#else#endif原创 2021-04-12 11:43:35 · 287 阅读 · 0 评论 -
gdb挂起断点和断点处理流程
gdb在每次应用加载了新的共享库的时候和卸载共享库的时候都会对断点进行解析.将需要添加到对应地方的断点执行绑定操作,需要删除的设置为挂起断点.修改行为.挂载断点行为.默认set breakpoint pending auto,采用应答的方式.确认set breakpoint pending on,采用默认确认,即不需要应答,就添加.否认set breakpoint pending off,采用默认拒绝,即不允许挂起,这种就只能在共享库加载了之后再设置.查看show breakpoint pend原创 2021-04-11 20:25:21 · 490 阅读 · 0 评论 -
gdb调试动态库
场景:动态库一般用于共享,或者是模板编程.如果是模板编程,即大的逻辑基本相同,只是小的分为不同项目级别的不同.动态库也被其他的使用,在使用的时候可以使用python调用并测试.动态库调试的问题:在启动的时候,gdb不会去动态库读取符号表,以及相关调试信息.所以一般断点都是以追加的方式等待.在gdb启动的时候,可以将参数放在配置文件中,就可以避免每次调试都输一次.但是当输入的内容包含给动态库设置断点的时候.就需要用pending且主动应答的方式.因为默认情况下,添加未加在的代码,需要确认.原创 2021-04-11 17:12:43 · 471 阅读 · 0 评论 -
gdb处理多个匹配
添加的时候通过模糊添加,可能有多个匹配.删除只能针对编号删除,不能针对某个进行删除.如果要删除只能重新创建,更精确的匹配.对具体的某些断点进行禁用启用.可以通过n.m的方式进行操作,也可以通过n.x-y的方式对多个进行操作....原创 2021-04-11 15:53:44 · 64 阅读 · 0 评论 -
gdb查看断点
gdb原创 2021-04-11 15:08:40 · 14599 阅读 · 0 评论 -
gdb给指定函数设置断点加强
匹配简介正则的方式匹配。正则语法用的是grep的语法说明从符号表中搜索包含正则表达式子串的函数。符号表到debug的映射,映射到行和地址。正则回顾特殊符号集合1[1]23[2][3]\d[0-9],[0123456789]\D[^0-9],即取反,大写一般都是取反.\w[a-zA-z_0-9]^起始$末尾使用场景给类成员函数设置断点。给命名空间类成员设置断点。..原创 2021-04-11 14:22:37 · 598 阅读 · 0 评论 -
gdb设置条件断点
功能:在某个位置,当某个表达式的值为真的时候才停止.一般用于循环.问题:有的时候可能这个表达式在某个时间,其表达式的语法都不合法.但是自己知道其以后就会合法.这种可以采用强制的方式设置.比如给某个动态库设置,动态库在执行之前还没有加载,所以有的符号就不合法.指令:break location if condition比如:break main if argc > 5只有在入参数量超过五个的时候才会停止.如果地址或其他的不合法,将会导致不执行,即断点创建失败.break locati原创 2021-04-11 09:31:55 · 2618 阅读 · 0 评论 -
gdb给指定位置设置断点
指令break location这个location有三种.一种是模糊匹配.一种是精确匹配.一种是程序地址.模糊匹配:通过linenumber,function,+-offset,label的组合方式进行设置.但是这种设置往往具有二义性.精确匹配:则是显示的声明某个参数是什么,是文件还是函数.不会造成二义性.地址匹配:通过反汇编获取到程序地址,然后在指定的指令级别的地址停止....原创 2021-04-11 09:24:45 · 5798 阅读 · 0 评论 -
gdb查看进程状态
info program | info proc查看程序状态和查看进程状态.原创 2021-04-11 09:01:46 · 1845 阅读 · 0 评论 -
gdb搜索线程,为线程命名
命名:thread name [newname]为当前线程设置,没有参数则是删除.命名后info threads查看的时候就会看到这个.搜索:thread find [regexp]根据正则表达式搜索线程.一般在线程特别多的时候使用.比如搜索顶层正在执行某个函数的.或着是搜索线程号....原创 2021-04-10 22:17:18 · 470 阅读 · 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 · 155 阅读 · 0 评论 -
gdb查看所有线程
gdb多线程篇能力介绍gdb能调试多线程程序,可以同时调试多个进程.支持远程调试,即执行在另一个系统上的程序.另一个系统可以是不同平台.inferior用这么一个对象表示一个调试程序.不管有没有执行,都会记录.调试某个程序,调试多个程序就有多个inferior.默认创建一个,被调试程序不管有没有执行,即程序执行前存在,程序终止后也存在。可以理解为一个调试会话。一个程序一个会话。或者说一个进程一个会话,不过进程执行前和执行后都存在,所以用进程也不是很准..原创 2021-04-10 17:49:54 · 9824 阅读 · 0 评论