gdb调试

本文详细介绍了如何在Linux系统中安装GDB,配置环境,以及一系列基础和进阶的调试命令,包括多进程和多线程调试技巧。
摘要由CSDN通过智能技术生成

安装

sudo apt install gdb -y

cat >>  ~/.bashrc << E
alias gdb='gdb -q'
E

cat >> ~/.gdbinit << E
set confirm off
E

基础命令

r:开始运行程序,直到断点; r xx xx传参;c继续,直到断点
n:单步调试,不会进入函数内部; s会进入函数内部
p:看变量或表达式的值,如 p name, p strlen(name);p a=5 改变变量值
b xx.cpp:6,给第6行打断点;i b :查看断点情况; d 1 删除断点号(i b查看)
fin:跳出函数; u:跳出循环
bt:查看堆栈,查看运行到哪一行
watch a: 设置观察点,当a发生变化,就打印,并停止运行;
i watchpoints:查看所有观察点;d 1:删除观察点
i locals:查看函数内所有变量值
tb:临时断点,命中一次就去除
ctrl+c:暂停程序
ptype i:查看i的类型
return -1: 结束后面的语句直接返回指定值
l: 查看代码

调试正在运行的程序

./a.out 启动程序
再开一个窗口:gdb -p $(pgrep a.out)
程序就会暂停,bt查看堆栈看程序停在哪里
调试完后,使用detach,即可关闭gdb,程序继续运行

调试多进程

set follow-fork-mode [parent(默认)|child] 选择调试父进程/子进程
set detach-on-fork [on|off] 运行所有进程/只运行当前进程
i inferiors 查看调试进程, inferiors 1 切换到1进程

调试多线程

i threads 查看所有线程, thread 2 切换到2线程
set scheduler-locking on(只运行当前线程)|off(运行所有线程)

调试core文件

core文件是的程序崩溃时内存状态dump出来的文件。就是车祸现场的快照。

  1. 准备工作:
ulimit -c unlimited 
sudo /sbin/sysctl -w kernel.core_pattern=./core
  1. 生成-g版本,示例:
void foo() {
    int *p = nullptr;
    *p = 42;  
}

int main() {
    foo();
    return 0;
}
g++ 1.cpp -g
./a.out 
Segmentation fault (core dumped)

core文件已生成,进入:

gdb a.out core.681007

如图:

Reading symbols from a.out...
[New LWP 681007]

warning: Section `.reg-xstate/681007' in core file too small.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.

warning: Section `.reg-xstate/681007' in core file too small.
#0  0x000055857980f13d in foo () at 1.cpp:3
3           *p = 42;  

它会停在崩溃处,一般后续:

bt   查看堆栈
i locals 查看所有局部变量
p val 查看某个变量
或者打断点,让他重跑
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值