datetime:2022/12/17 16:07
author:nzb
gdb调试
gdb的安装
CentOS系统中,用root用户登录服务器,执行以下命令安装或升级。
yum -y install gdb
注意,如果您的服务器没有安装gdb,以上命令就会安装最新版本的gdb,如果已经安装了gdb,就会更新到最新版本的gdb,所以,以上命令不管执行多少次都没有问题。
安装gdb,前提条件是服务器必须接入互联网。
调试前的准备
用gcc编译源程序的时候,编译后的可执行文件不会包含源程序代码,如果您打算编译后的程序可以被调试,编译的时候要加-g的参数,例如:
gcc -g -o book113 book113.c
在命令提示符下输入gdb book113就可以调试book113程序了。
gdb book113
基本调试命令
命令 | 命令缩写 | 命令说明 |
---|---|---|
set args | 设置主程序的参数。 例如:./book119 /oracle/c/book1.c /tmp/book1.c 设置参数的方法是: gdb book119 (gdb) set args /oracle/c/book1.c /tmp/book1.c |
|
break | b | 设置断点,b 20 表示在第20行设置断点,可以设置多个断点。 |
run | r | 开始运行程序, 程序运行到断点的位置会停下来,如果没有遇到断点,程序一直运行下去。 |
next | n | 执行当前行语句,如果该语句为函数调用,不会进入函数内部执行。 |
step | s | 执行当前行语句,如果该语句为函数调用,则进入函数执行其中的第一条语句。 注意了,如果函数是库函数或第三方提供的函数,用s也是进不去的,因为没有源代码,如果是您自定义的函数,只要有源码就可以进去。 |
p | 显示变量值,例如:p name表示显示变量name的值。 | |
continue | c | 继续程序的运行,直到遇到下一个断点。 |
set var name=value | 设置变量的值,假设程序有两个变量:int ii; char name[21]; set var ii=10 把ii的值设置为10; set var name="西施" 把name的值设置为"西施",注意,不是strcpy。 |
|
quit | q | 退出gdb环境。 |
注意,在gdb环境中,可以用上下光标键选择执行过的gdb命令。
调试core文件
程序挂掉时,系统缺省不会生成core文件
ulimit -a
: 查看系统参数ulimit -c unlimit
: 把 core 文件的大小设置为无限制- 运行文件,生成core文件
- gdb 程序名 core文件名
root@7bae19ca1bcd:~/c++/gdb# ./core_demo
Segmentation fault (core dumped)
# 报错生成 core 文件
root@7bae19ca1bcd:~/c++/gdb# ls
core core_demo core_dmeo.cpp
root@7bae19ca1bcd:~/c++/gdb# gdb core_demo core
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
Copyright (C) 2014 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 core_demo...done.
[New LWP 43]
Core was generated by `./core_demo'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00000000004005dc in bb (bbb=13) at core_dmeo.cpp:10
10 *p = bbb; // 报错行
(gdb) bt // bt,显示调用栈
#0 0x00000000004005dc in bb (bbb=13) at core_dmeo.cpp:10
#1 0x00000000004005f5 in aa (aaa=13) at core_dmeo.cpp:15
#2 0x0000000000400609 in main () at core_dmeo.cpp:20
(gdb)