linux安装和使用gdb调试工具

一、安装gdb工具

sudo apt-get update
sudo apt-get install gdb 

查看gdb版本

gdb -v

shell终端打印版本信息如下:

GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1

二、gdb工具的使用方法

2.1、编译生成可执行文件

 gcc HttpClient.c -o out -g -I ./

上面一段命令表示将HttpClient.c编译后生成一个名为out的可执行文件,-I表示头文件路径

2.2、开始gdb调试

使用gdb后跟可执行文件进入gdb调试模式

gdb out

使用start命令开启gdb调试

start

使用quit命令退出gdb调试

quit

命令执行后,shell打印如下内容:

root@ubuntu:/mnt/hgfs/linux_learn/c_program/HttpClient# gdb out
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from out...(no debugging symbols found)...done.
(gdb) start
Temporary breakpoint 1 at 0x387
Starting program: /mnt/hgfs/linux_learn/c_program/HttpClient/out 
/bin/bash: /mnt/hgfs/linux_learn/c_program/HttpClient/out: cannot execute binary file: Exec format error
/bin/bash: /mnt/hgfs/linux_learn/c_program/HttpClient/out: Success
During startup program exited with code 126.
(gdb) quit

如果不希望打印gdb的版本信息,可以加上-q指令,使界面更加简洁:

gdb -q out

界面如下:

root@ubuntu:/mnt/hgfs/linux_learn/c_program/HttpClient# gdb -q out 
Reading symbols from a.out...(no debugging symbols found)...done.
(gdb) 

2.3、gdb常用命令

  1. 单步执行

n是next的缩写,表示执行下一行代码,如果要逐行执行汇编代码可以用nexti

n
  1. 跳转到函数内部

step命令用于跳转到函数内部,这个命令可以简写为s。如果函数是汇编代码,可以使用stepi命令跳转

step

如果需要跳出函数可以执行finish命令,该命令执行后会在shell中打印函数的返回值。

finish

打印结果如下:

(gdb) finish
Run till exit from #0  HttpClientPhaseUrl (
    url=0x5555555550a0 "https://www.ssaidu.com:80/a.gif", 
    client=0x7fffffffe2c0) at HttpClient.c:31
0x0000555555554efb in main () at HttpClient.c:174
174		ret = HttpClientPhaseUrl(url,&hc_client);
Value returned is $1 = 0

finish命令执行后函数会正常运行,并且返回正确的值。我们也可以通过return命令来使函数返回我们希望返回的值,方便调试和排错。

return
  1. 设置断点

使用break命令可以给代码设置断点,程序到达断点就会停止运行,break设置断点的方式比单步执行效率更高。break命令可以简写为b。

格式 说明
break <函数名> 对当前正在执行的文件中的指定函数设置断点
break <行号> 对当前正在执行的文件中的特定行设置断点
break <文件名:行号> 对指定文件的指定行设置断点
break <文件名:函数名> 对指定文件的指定函数设置断点
break <+/-偏移量> 当前指令行+/-偏移量处设置断点
break <*地址> 指定地址处设置断点
  1. 删除断点

断点的删除可以用clear和delete命令

格式 说明
clear <函数名> 删除当前正在执行的文件中的指定函数前的断点
clear <行号> 删除特定行的断点
clear <文件名:行号> 删除指定文件的指定行的断点
clear <文件名:函数名> 删除指定文件的指定函数的断点
clear <+/-偏移量> 当前指令行+/-删除偏移量处的断点
clear <*地址> 删除指定地址处的断点
  • delete 删除所有断点
  • delete 删除当前文件中的第n个断点
  • delete 删除第n到m个断点
  • delete <函数名>删除函数中的所有断点
  1. run和continue命令
  • 执行run命令后程序会从头开始运行,直到遇到断点或者程序结束。
  • 执行continue命令程序会从当前执行位置往下运行,直到遇到断点或者程序结束。
  1. 打印变量的值

在gdb调试模式下可以使用print打印当前变量的值或者地址,并且还可以指定打印输出的格式

print /格式 变量

print支持的格式如下:

  • x 显示为十六进制数
  • d 显示为十进制数
  • u 显示为无符号十进制数
  • o 显示为八进制数
  • t 显示为二进制数
  • a 地址
  • c 显示为字符(ASCII)
  • f 浮点小数
  • s 显示为字符串
  • i 显示为机器语言,仅在显示内存的 x 命令中可用

print还可以打印寄存器的值

print /格式 $寄存器名

比如要查看pc指针的地址可以用如下命令,注意pc小写:

print $pc
  1. info命令

info命令可以用来查看寄存器、地址、断点等信息。

  • info all-registers 查看所有寄存器的值
  • info register 查看某个寄存器的值,如info register pc命令可以查看PC指针的内容
  • info breakpoints 查看所有断点位置,breakpoints可以简写为break或者b
info breakpoints
info break
info b
  1. list命令

list命令用于查看源代码。

  • list 显示当前行之后的代码,默认显示十行,按回车查看更多;
  • list - 显示当前行之前的代码;
  • list <行号>显示指定行号前后的代码;
  • list <文件名:行号>显示指定文件中指定行号前后的代码;

猜你喜欢

转载自blog.csdn.net/weixin_39270987/article/details/119606094