中企动力网站怎么样,临淄网站建设价格,wordpress如何改界面,网站建设公司易下拉软件GDB之(1)基础入门指令参数介绍
Author#xff1a;Once Day Date: 2022年7月29日/2024年2月26日
漫漫长路#xff0c;才刚刚开始…
全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客
推荐参考文档#xff1a;
GDB: The GNU Project Debugger (sourceware.o…GDB之(1)基础入门指令参数介绍
AuthorOnce Day Date: 2022年7月29日/2024年2月26日
漫漫长路才刚刚开始…
全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客
推荐参考文档
GDB: The GNU Project Debugger (sourceware.org)GDB Documentation (sourceware.org)用GDB调试程序 _CSDN博客 _陈皓linux下gdb调试方法与技巧整理-CSDN博客_花开蝶自来 文章目录 GDB之(1)基础入门指令参数介绍1.引言2. 程序运行时可设置的环境和变量2.1 程序运行参数2.2 运行环境2.3 工作目录2.4 程序的输入输出 3.暂停程序3.1 设置断点3.2 设置观察点3.3 设置捕捉点 4.清除停止点5. 恢复程序运行和单步调试6.信号处理7. 多线程8. 查看栈信息9.显示源代码9.1 源码搜索9.2 指定源文件的路径9.3 查看源代码在内存中的地址 10. 查看运行时数据10.1 使用examine(x)查看内存地址的值10.2 自动显示 11.设置显示(print)选项11.2 print历史记录11.3 GDB环境变量11.4 查看寄存器 12. 查看内存映射信息12.1 查看虚拟地址映射情况12.2 查看动态库加载情况12.3 加载特定动态库的符号表 1.引言
使用gcc编译c/c时需要使用-g来生成调试信息。
启动gdb有以下几种program即需要调试的执行文件 gdb program gdb program core配合coredump进行调试。 gdb program PID指定服务程序的运行时的进程IDgdb会自动attach上去。
启动时可以加入一些常用的参数 -s从指定文件读取符号表 -se从指定文件读取符号表信息并把他用在可执行文件中 -c调试时coredump的core文件 -d加入一个源文件的搜索路径默认搜索路劲是环境变量中PATH所定义的路径
gdb环境之下可以运行shell命令以及make命令
(gdb) shell ls
(gdb) make [args]2. 程序运行时可设置的环境和变量
2.1 程序运行参数
set设置程序开始运行时的输入参数show展示目前的参数列表。
(gdb) set args 15 145 155 145
(gdb) show args
Argument list ... is 15 145 155 145.用于main(int,char*)的参数输入。
2.2 运行环境
path设定程序的运行路径show查看程序的运行路径set environment 设置环境变量show environment查看环境变量。
(gdb) path .
Executable and object file path: /home/onceday/new:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
(gdb) show path
Executable and object file path: /home/onceday/new:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
(gdb) set environment ONCEday
(gdb) show environment ONCE
ONCE day环境变量用于main(argc,argv,env)中的env。
2.3 工作目录
cd切换目录 pwd显示当前目录。
2.4 程序的输入输出
info terminal 显示你程序用到的终端模式
run outfile 使用重定向控制程序输出
tty /dev/ttyb 可以指写输入输出的终端设备
3.暂停程序
当程序暂停时可用info program来查看程序信息。
有如下几种暂停方式 断点(Breakpoint) 观察点(WatchPoint) 捕捉点(CatchPoint) 信号(Signals) 线程停止(Thread Stops)
可使用c或者continue命令恢复程序运行。
3.1 设置断点 break function在进入指定函数时停住 可以增加类名和类型名 break linenum在指定行号停住 break offset /break -offset在当前行号的前面或后面offset行停住 break filename:linenum在源文件filename的linenum行处停住 break filename:function在源文件filename的function函数的入口处停住 break *address在程序运行的内存地址处停住 break ,在下一条指令处停住 break ... if condition...表示上述的参数这个可以在条件成立时停住。
3.2 设置观察点
观察点一般是来观察某个表达式(变量也是一种表达式)的值是否有变化如果有变化马上停止程序。 watch expr为表达式变量设置观察点一旦表达式值有变化马上停止程序。 rwatch expr当表达式变量被读时停住程序。 awatch expr当表达式变量的值被读或者写的时候停住程序。 info watchpoints列出当前所设置了的所有观察点。
3.3 设置捕捉点
可以设置捕捉点来捕捉程序运行时的一些事情如载入共享库(动态链接库)或是C的异常。
catch event
catch assert -- Catch failed Ada assertions, when raised.
catch catch -- Catch an exception, when caught.
catch exception -- Catch Ada exceptions, when raised.
catch exec -- Catch calls to exec.
catch fork -- Catch calls to fork.
catch handlers -- Catch Ada exceptions, when handled.
catch load -- Catch loads of shared libraries.
catch rethrow -- Catch an exception, when rethrown.
catch signal -- Catch signals by their names and/or numbers.
catch syscall -- Catch system calls by their names, groups and/or numbers.
catch throw -- Catch an exception, when thrown.
catch unload -- Catch unloads of shared libraries.
catch vfork -- Catch calls to vfork.4.清除停止点
清除停止点 clear清除所有的已定义的停止点。 clear [filename:]function清除所有设置在函数上的停止点。 clear [filename:]function清除所有设置在指定行上的停止点。 delete breakpoints删除指定的断点breakpoints为断点号。 delete range...删除指定范围内的断点。 delete删除所有断点。 disable breakpoints停止指定的断点。 disable range...停止指定范围内的断点。 disable停止所有断点 enable [breakpoints] [range...]使能断点 enable [breakpoints] once range...使能一次程序停止后 会被GDB自动disable。 enable [breakpoints] delete range...使能一次程序停止后会被GDB自动删除。
可以用condition修改断点的停止条件即满足后面的表达式
condition bnum expression #修改断点号bnum的停止条件为expression
condition bnum #清除断点号为bnum的停止条件比较特殊的维护命令ignore可以指定程序运行忽略停止条件几次。
ignore bnum count还可以为停止点设定运行命令
当运行程序被停止住时可以让其自动运行一些别的命令。
commands [bnum]
... command-list ...
end实例如下
break foo if x0
commands
printf x is %d/n,x
continue
end5. 恢复程序运行和单步调试
当程序被停住了可以用continue命令恢复程序的运行直到程序结束或者下一个断点的到来。如下三个命令
continue [ignore-count]
c [ignore-count]
fg [ignore-count]ignore-count表示忽略其后的断点次数。
单步跟踪step如果有函数调用会进入该函数前提是此函数被编译有debug信息。
step count #count表示执行指令的条数不加则为1单步跟踪next如果有函数调用不会进入该函数。
next count #count表示执行指令的条数不加则为1可以打开step-mode模式在进行单步跟踪时程序不会因为没有debug信息而靠不住。
set step-mode on
set step-mode off finish运行程序直到当前函数完成返回并打印函数返回时的堆栈地址和返回值即参数值等信息。
until 或 u 可以在一个循环体内单步跟踪这个命令可以运行程序直到退出循环体。
stepi或sinexti或ni:单步跟踪一条机器指令一条程序代码有可能由数条机器指令完成。
6.信号处理
GDB可以在调试程序的时候处理任何一种信号。当收到指定的信号时拿上停住正在运行的程序以供你进行调试。
handle signal keywords ...信号可以书写为SIGIO-SIGKILL。
关键字有以下几种 nostop收到信号时GDB不会停住但可以打印出消息。 stop当被调试的程序收到信号时GDB会停住你的程序。 print当被调试的程序收到信号时GDB会显示出一条信息。 noprint当被调试的程序收到信号时GDB不会告诉你收到信号的信息。 pass noignore当被调试的程序收到信号时GDB不处理信号。这表示GDB会把这个信号交给被调试程序会处理。 nopass ignore当被调试的程序收到信号时GDB不会让被调试程序来处理这个信号。
可以使用info signals 、info handle查看有哪些信号在被GDB检测中。
7. 多线程
在多线程上定义断点
break linespec thread threadno
break linespec thread threadno if ...linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID。
ID由GDB分配的可以通过“info threads”命令来查看正在运行程序中的线程信息。
如果不指定thread threadno则表示断点设在所有线程上面。
还可以为某线程指定断点条件。如
(gdb) break frik.c:13 thread 28 if bartab lim当程序被GDB停住时所有的运行线程都会被停住。
而在恢复程序运行时所有的线程也会被恢复运行。那怕是主进程在被单步调试时。
8. 查看栈信息
当程序被停住可以通过查看栈信息来确认执行情况
backtrace
bt #函数调用栈
bt n #n是正整数表示只打印栈顶上n层的栈信息
bt -n #-n表示一个负整数表示只打印栈底下n层的栈信息查看某一层栈的信息
frame n
f nn是一个从0开始的整数是栈中的层编号比如frame 0表示栈顶frame 1表示栈的第二层。
up n #表示向栈的上面移动n层可以不打n表示向上移动一层。
down n #表示向下移动n层。以下命令不打印出移动的栈层信息
select-frame n 对应于 frame 命令。
up-silently n 对应于 up 命令。
down-silently n 对应于 down 命令。输出当前栈层信息的命令 可以使用info frame或info f打印出更为详细的当前栈层信息。 info args打印当前函数的参数名及其值。 info locals打印出当前函数中所有局部变量及其值。 info catch 打印出当前的函数中的异常处理信息。
9.显示源代码
编译时需要加上-g参数。
list [function:]linenum #显示程序第linenum行的周围的源程序list [filename:]function #显示函数名为function的函数的源程序。list #显示当前行后面的源程序。list - #显示当前行前面的源程序设置一次显示源代码的行数
set listsize countshow listsize #查看当前listsize的设置还有以下的选行显示
list first last #显示从first行到last行之间的源代码
list , last· #显示从当前行到last行之间的源代码
list #往后显示源代码9.1 源码搜索
可搭配正则表达式进行源代码搜索
forward-search regexp
search regexp #向前面搜索reverse-search regexp #全部搜索9.2 指定源文件的路径
directory dirname [: dirname2 ....]
dir dirname [: dirname2 ....]show directories #显示定义了的源文件搜索路径9.3 查看源代码在内存中的地址
打印出所指定的源码在运行时的内存地址
info line 行业/函数名/文件名行号/文件名函数名查看源程序的当前执行时的机器码这个命令会把目前内存中的指令dump出来
disassemble 函数名....10. 查看运行时数据
print expr
print /f exprexpr是表达式是你所调试的程序的语言的表达式GDB可以调试多种编程语言f是输出的格式。
print while(cur)
表达式可支持以下几种操作符 ::指定一个在文件或是在一个函数中的变量。 一个和数组有关的操作符 {type} addr表示一个指向内存地址的类型为type的一个对象。
示例如下
p file::variable
p function::variable
p f2.c::x
p *arraylen #int *array (int *) malloc (len * sizeof (int));静态数组直接print数组名即可输出数组内容。
/f格式有以下几种 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十六进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 c 按字符格式显示变量。 f 按浮点数格式显示变量。
示例如下
(gdb) p /f i
$24 1.41531145e-4310.1 使用examine(x)查看内存地址的值
x [/n/f/u] addr可选参数 n是一个正整数表示显示内存的长度。 f表示显示的格式即上面所展示的。 u表示从当前地址往后请求的字节数。默认是4个bytes。以下为预设的几种字符 b表示单字节 h表示双字节 w表示四字节 g表示八字节
示例
x/3uh 0x54320表示从内存地址0x54320读取内容h表示以双字节为一个单位3表示三个单位u表示按十六进制显示。
10.2 自动显示
当程序停住时这些变量可以自动显示。
display expr
display /fmt expr示例
display /i $pc $pc是GDB的环境变量表示着指令的地址/i 输出汇编指令。
删除自动显示
undisplay dnums...
delete display dnums...dnums是需要自动显示的变量的序列号。
使用info display可以观察当前所有的自动显示变量以及它们的序列号。
使用示例
delete display 2,3 #同时删除序列号2和3对应的自动显示变量
disable display 2,3 #同时失效序列号2和3对应的自动显示变量
enable display 2-5 #同时使能序列号2-5范围内的所有对应自动显示变量11.设置显示(print)选项
1.打开地址输出当程序显示函数信息时GDB会显出函数的参数地址。系统默认为打开的
set print address on
set print address off2.打开数组显示打开后当数组显示时每个元素占一行如果不打开的话每个元素则以逗号分隔。这个选项默认是关闭的。
set print array
set print array on3.设置数组显示的最大长度以及显示当前print elements的选项信息。
set print elements number-of-elements
show print elements4.当显示字符串时遇到结束符则停止显示这个选项默认为off。
set print null-stop on/off5.以漂亮的格式显示结构体等内容。
set print pretty on
set print pretty off6.设置字符显示是否按“/nnn”的格式显示
set print sevenbit-strings on/off7.设置显示结构体时是否显式其内的联合体数据。
set print union on/off8.对象、成员、虚函数等C类设置
set print object on/off #对对象指针的处理方法在C中如果一个对象指针指向其派生类如果打开这个选项GDB会自动按照虚方法调用的规则显示输出如果关闭这个选项的话GDB就不管虚函数表了。这个选项默认是off。
set print static-members on/off这个选项表示当显示一个C对象中的内容是是否显示其中的静态数据成员。默认是on。
set print vtbl on/off当此选项打开时GDB将用比较规整的格式来显示虚函数表时。其默认是关闭的。
11.2 print历史记录
GDB会记录当前运行过程中产生的print记录并以$1、$2、$3…这样的方式来编号。
那么就可以使用$1这样的方式来重新输入之前的print表达式。
11.3 GDB环境变量
可以在GDB的调试环境中定义自己的变量用来保存一些调试程序中的运行数据。
使用以下命令即可定义一个GDB变量
set $foo *object_ptr使用以下命令可以查看当前设置的所有的环境变量。
show convenience环境变量可以和程序变量交互使用
set $i 0
print bar[$i]-contents11.4 查看寄存器
使用以下命令即可查看寄存器情况(不包括浮点寄存器)
info registers以下命令可以包括浮点寄存器
info all-registers查看所指定的寄存器的情况
info registers regname ...也可以使用print命令访问($寄存器名)
print $sp12. 查看内存映射信息
12.1 查看虚拟地址映射情况
info proc mapping12.2 查看动态库加载情况
info sharedlibrary 12.3 加载特定动态库的符号表
当你在 GDB 中调试一个程序并且这个程序在运行时加载了动态库你可以使用 info sharedlibrary 命令查看已加载的动态库及其状态。例如
(gdb) info sharedlibrary这将显示所有已加载的动态库及其加载状态。如果某个动态库的符号表还没有加载你可以使用 sharedlibrary 命令来加载它。例如如果你想加载所有动态库的符号表你可以使用
(gdb) sharedlibrary如果你只想加载特定动态库的符号表你可以提供库的名称作为参数。例如如果你想加载名为 libmylib.so 的库的符号表你可以使用
(gdb) sharedlibrary libmylib请注意你必须确保 GDB 能找到动态库的符号表。这通常意味着你需要在系统的库路径例如 /usr/lib 或 /lib或者 GDB 的库路径可以使用 set solib-search-path 命令设置中有动态库的调试版本。 Once Day 也信美人终作土不堪幽梦太匆匆...... 如果这篇文章为您带来了帮助或启发不妨点个赞和关注再加上一个小小的收藏⭐ (◕‿◕)感谢您的阅读与支持~~~