每天学点Linux命令(2)-gdb

每天学点Linux命令(2)-gdb

1.gdb的作用

  • 监视程序中变量值的变化
  • 设置断点,使程序在指定的代码行暂停执行,便于观察。
  • 单步执行代码。
  • 分析崩溃程序产生的core文件。

2. gdb的使用方法

  • 通过gcc生成带调试信息的文件
    • gcc -g sourcefile -o program
    • gdb program
  • 通过core文件去执行
    • gdb exefile corefile
  • 调试服务程序-指定服务程序运行时的PID,gdb会自动attach上去,并调试
    • gdb serverPro PID

3. gdb的常用指令

3.1 运行

命令简称作用
runr运行程序,在断点处会停止,等待输出
continuec继续执行,到下一处断点或结束
nextn单步跟踪,但是不进入函数
steps单步跟踪,进入函数
until-之间运行退出循环,省去单步跟踪的步骤
until+linenumber-运行至某行
finish-运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
call 函数(参数)-调用程序中可见的函数,并传递“参数”
quitq退出gdb

3.2 设置断点

命令简称作用
break nb n在第n行设置断点,可以带上代码路径和代码名称b a.cpp:578
break fn1 if a>bbreak->b条件断点设置
break funcb func在函数func()的入口设置断点
delete 断点号n-删除第n个断点
disable 断点n-暂停第n个断点
enable 断点n-开启第n个断点
clear 行号n-清除第n行的断点
info breakpointsinfo b显示当前程序的断点设置情况
delete breakpoints-清除所有断点

3.3 查看源代码

命令简称说明
listl列出程序的源代码,默认显示10行,继续list接着显示10行
list 行号显示以行号为中心的前后10行
list 函数显示函数的源代码

3.4 打印表达式

命令简称说明
print ap a显示变量a的值
print func(a)显示参数为a的func调用的结果
display a在每次单步运行之后显示a的值
watch a设置监视点,一旦a的值改变,程序就终止
whatis查询变量和函数
info func查询函数
info locals显示当前堆栈页的所有变量

3.5 查询运行信息

命令简称说明
where/bt当前运行的堆栈列表
bt backtrace显示当前调用堆栈
up/down改变堆栈显示的深度
set args 参数指定运行时的参数
show args查看设置好的参数
info program查看程序是否在运行,进程号等信息

3.6 窗口分割

命令简称说明
layout src显示源码窗口
layout asm显示反汇编窗口
layout regs显示源代码/反汇编和CPU寄存器窗口
layout split显示源代码和反汇编窗口
Ctrl+L刷新窗口

4.实践出真知

  • 通过一个简单的例子,展示出gdb的正确使用方式。

代码

//sort.c
#include <stdio.h>
void BubbleSort(int *arrs, int size)
{
    if (arrs == NULL || size <= 1)
        return ;
    //排序的趟数
    for (int i = 0; i < size - 1; ++i)
    {
        for (int j = 0; j < size - i - 1; ++j)
        {
            if (arrs[j] > arrs[j+1])
            {
                int tmp = arrs[j];
                arrs[j] = arrs[j+1];
                arrs[j+1] = tmp;
            }
        }
    }

}
#include "sort.h"
#include "stdio.h"
int main()
{
    printf("This is a sort test");
    int arrs[5] = {9,2,3,4,5};
    BubbleSort(arrs,5);
    for (int i = 0;i < 5; ++i)
    {
        printf("a[%d]:%d ", i , arrs[i]);
    }
    printf("The test is over");
    return 0;
}

实际运行效果

  • 添加断点

  • 执行单步调试

  • 步入函数

  • 列出源码l

  • 列出寄存器窗口- layout regs

    )

注意事项

macbook上使用gdb比较麻烦,需要添加代码签名,具体方法可百度,本博客不做介绍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值