Linux下GDB调试

GDB调试方式一般有三种:

启动调试前确保该程序生成调试信息

gdb相关调试命令:

命令缩写描述
runr运行一个程序
continuec让暂停的程序继续运行
breakb       添加断点
tbreadktb添加临时断点
backtracebt查看当前线程的调用堆栈
framef切换到当前调用线程的指定堆栈
infoinfo查看断点,线程等信息
enableenable启用某个断点
disabledisable禁用某个断点
deletedel删除断点
listl显示源码
printp       打印或修改变量、寄存器的值
ptypeptype查看变量类型
threadthread切换到指定线程
nextn运行到下一行
steps如果有调用函数,进入函数内部
untilu运行到指定的行停下来
finishfi结束当前调用函数,到上一层函数调用处
returnreturn

结束当前调用并返回指定的值,到上一层调用处

jumpj将当前程序的执行流跳转到指定的行或地址
disassembledis查看汇编代码
watchwatch监视某一变量
displaydisplay监视某一变量,程序结束输出
dirdir重定向源码文件的位置

编译生成时:

g++/gcc -g -o test test.cpp   //-g为生成调试信息

一、gdb 直接启动程序调试

gdb testname   //testname为程序名称

  然后使用相关命令查看程序内存信息;

二、gdb 附加进程调试

gdb attach pID    //pID程序运行pid

然后使用命令查看程序内存信息

退出attach

distach    //解除绑定attach,不影响程序继续运行

三、gdb调试程序崩溃 (调试core文件,定位程序崩溃问题)

Demo程序段:

#include <iostream>
using namespace std;

class A
{

public:
        A(){m_a = 10;};
        int Get()
        {
                return m_a;
        };
int m_a;
};
int main()
{
        A* a = 0;
        cout<<"A调用"<<a->Get()<<endl;    //非正常程序,测试
        int B[10] = {0};
        for(int i = 0 ; i < 15;i++)
        {
                int c = B[i];            //非正常程序,测试
                cout<<"c="<<c<<endl;
        }
        cout<<"hello world";
        return 0;
}

确保设置生成core文件

ulimit -c

如果输出size为0,表示没有开启生成core文件

开启:

ulimit -c unlimited  //unlimited 表示生成不限制大小的core文件,也可以指定大小

开启后可以通过命令查看是否配置成功

表示配置成功

这样的方式配置只是临时的,如果需要永久生效,需要修改/etc/security/limits.conf文件

#<domain>   <type> <item> <value>
*            soft   core   unlimited    

 把ulimit -c unlimited 行添加到/etc/profile文件中, 生效配置

source /etc/profile

开始测试demo程序,运行后

程序崩溃,并在当前目录下生成core.3730的文件,调试这个文件即可定位程序错误

gdb test core.3730

 

 输出信息显示,在程序11行调用时有空指针;

最后可以根据提示修改代码,解决崩溃;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值