Table of Contents

调试时调用函数

观察点

GDB宏


调试是一项复杂的任务。开发人员大部分时间都花在调试上,因此熟悉许多调试工具很重要

在Linux中,本机调试器是GDB,它是基于命令行的,看起来丑陋而原始。许多开发人员,尤其是那些从Windows移走并使用Visual Studio等工具的开发人员,都没有给GDB一个机会。

GDB是基于命令行的,您需要学习命令,并且看起来像在80年代进行调试,但是有些任务只能用GDB来完成

我们将使用以下代码:

#include<stdio.h>#define addnum(a,b) ((a)+(b))
#define max(a,b) (a)>(b)?(addnum(a,100)):(addnum(b,50))int a1=10,a2=20;void f2()
{printf("X");
}void print_dbg()
{char buf[15];printf("a1=%d a2=%d \n",a1,a2);strcpy(buf, "hello world");}int add(int a, int b)
{int c;c= max(a+90,b+20);c+=b;return c;
}void f1()
{int i;int *p=NULL;print_dbg();i=add(80,90);for(i=0;i<100;i++){if(i % 20 == 0)a1++;f2();}*p=100;
}
int arr[1000];void main()
{arr[0]=1;f1();printf("hello %d\n",arr[0]);
}

调试时调用函数

当GDB在断点处停止或执行代码时,您可以调用带有或不带有参数的函数。

(gdb) b add
Breakpoint 1 at 0x400654: file ./a.c, line 21.
(gdb) r
Starting program: myapp
a1=10 a2=20 Breakpoint 1, add (a=80, b=90) at ./a.c:21
21      int c= a+90;
(gdb) call print_dbg()
a1=10 a2=20
(gdb) delete breakpoints
Delete all breakpoints? (y or n) y
(gdb) b a.c:34
Breakpoint 2 at 0x4006bd: file ./a.c, line 34.
(gdb) c
Continuing.Breakpoint 2, f1 () at ./a.c:34
34              a1++;
(gdb) call add(2,3)
$1 = 95

观察点

GDB的主要功能之一是能够在更改某些内容时中断。它可以是变量,地址或寄存器:

(gdb) watch a1
Hardware watchpoint 1: a1
(gdb) r
Starting program: /home/developer/examples/debuggingExamples/debugtests/app
a1=10 a2=20 Hardware watchpoint 1: a1Old value = 10
New value = 11
f1 () at ./a.c:35
35          f2();

观看地址变更

我们首先打印数组地址:

(gdb) p &arr
$1 = (int (*)[1000]) 0x601080 <arr>

然后要求GDB在该地址的内容更改时停止

(gdb) watch *0x601080
Hardware watchpoint 1: *0x601080
(gdb) r
Starting program: /home/developer/examples/debuggingExamples/debugtests/app Hardware watchpoint 1: *0x601080Old value = 0
New value = 1
main () at ./a.c:43
43  f1();

观察点注册变更

使用寄存器也可以这样做。

(gdb) watch $rax
Watchpoint 1: $rax(gdb) c
Continuing.Watchpoint 1: $raxOld value = 4196067
New value = 0
0x00000000004006f6 in main () at ./a.c:43
43  f1();

GDB宏

使用.gdbinit文件,您还可以为调试会话定义新命令(宏)。例如,如果您将以下内容写入.gdbinit:

define irginfo registersinfo threads
enddefine pdbprint a1print a2call print_dbg()
end

它定义了两个可以使用的新宏– pdb,irg

(gdb) pdb
$2 = 10
$3 = 20
a1=10 a2=20
(gdb) irg
rax            0x0  0
rbx            0x0  0
rcx            0x6f77206f6c6c6568   8031924123371070824
rdx            0x7ffff7dd3780   140737351858048
rsi            0x5a 90
rdi            0x50 80
rbp            0x7fffffffdb50   0x7fffffffdb50
rsp            0x7fffffffdb50   0x7fffffffdb50
r8             0x0  0
r9             0xd  13
r10            0x0  0
r11            0x246    582
r12            0x4004e0 4195552
r13            0x7fffffffdc60   140737488346208
r14            0x0  0
r15            0x0  0
rip            0x400654 0x400654 <add+10>
eflags         0x246    [ PF ZF IF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
fs             0x0  0
gs             0x0  0Id   Target Id         Frame
* 1    process 35330 "app" add (a=80, b=90) at ./a.c:28

https://devarea.com/10-things-you-can-only-do-with-gdb/#.X3roCkUzaUk

gdb调试时调用函数、设置观察点以及GDB的宏相关推荐

  1. GDB调试时的参数设置

    若正常运行可执行文件pbrt.debug时带有参数,比如: pbrt.debug ~/pbrt/killeroos/killeroos-simple.pbrt 那么,用GDB调试pbrt时应该这样: ...

  2. GDB调试之前的相关设置,会使程序调试起来,事半功倍

    GDB调试之前的相关设置: https://blog.csdn.net/QIBAOYUAN/article/details/6116265

  3. gdb调试时,Program received signal SIGPIPE, Broken pipe.

    今天在gdb调试时,发现总是出现Program received signal SIGPIPE, Broken pipe,搜索了网上的资料,发现是在调试时,接收到了SIGPIPE这个signal信号导 ...

  4. Linux——gdb调试时多进程切换方法(attach/follow-fork-mode)

    对于程序中创建子进程的情况,进行gdb调试时会默认选择父进程进行调试,假如需要对子进程进行调试就需要使用特殊方法. 共有两种方法可供选择: 目录 一.attach子进程PID ①.运行进程 ②获取进程 ...

  5. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  6. linux gdb 跳出函数,gdb调试程序时跳进函数和跳出函数

    文章目录 前言 测试代码 代码编译 step/finish组合 step/return组合 总结 前言 说实话平时在Windows平台上开发,gdb调试用的并不是很多,但是一些在linux平台才会出现 ...

  7. gdb调试程序时跳进函数和跳出函数

    文章目录 前言 测试代码 代码编译 step/finish组合 step/return组合 总结 前言 说实话平时在Windows平台上开发,gdb调试用的并不是很多,但是一些在linux平台才会出现 ...

  8. 解决gdb 调试 core 文件函数名显示为问号的问题

    关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样 ...

  9. 【全网最暴力解决方案】使用gdb调试时遭遇“Missing separate debuginfos, use: debuginfo-install glibc....”报错信息

    问题现象 日前在CentOS 6虚拟机上使用gdb调试一个由简单的.c文件编译生成的可执行程序遭遇如下gdb报错 Missing separate debuginfos, use: debuginfo ...

最新文章

  1. 自带数据线的迷你数显充电宝,旅途必备
  2. Ext JS高级程序设计
  3. 【Kaggle】Intermediate Machine Learning(XGBoost + Data Leakage)
  4. 官宣丨中国移动云能力中心新增5项可信云认证,斩获2项大奖!
  5. linux 下挂载光驱
  6. linux mysql远程连接
  7. 三种工厂模式详解-简单工厂模式、工厂模式、抽象工厂模式
  8. 安装油猴(Tampermonkey)插件,让你的浏览器更强大
  9. cross_val_score的 scoring参数值解析
  10. 什么是虚继承?虚基类?
  11. 高博视觉SLAM十四讲思维导图分享
  12. 世界上最美的晚秋,美过油画,令人叫绝!
  13. 【深度学习 学习率,优化器】——深刻解读训练网络时各种学习率,优化器的区别,learning rate, Momentum
  14. golang GPM模型理解
  15. 如何解决 “无法成功完成操作,因为文件包含病毒或潜在垃圾软件
  16. Apache 屏蔽YisouSpider一搜蜘蛛神马的方法
  17. 网站优化,这十个工具你可以看看
  18. 使用oyente智能检测工具总结
  19. python 抽奖 配音乐_抖音上超好听的神曲音乐,Python教你一次性下载
  20. 万能火焰PNG素材,瞬间撩起气氛

热门文章

  1. linux进程跑飞了,【Shell】Linux信号(二)
  2. deepin安装tomcat
  3. 网络编程基础_5.3聊天室-多人聊天室
  4. 压测工具下载地址说明及汇总
  5. Python(set/list/dict/tuple)
  6. Struts向JSP中传值
  7. 10-2-DBUtils工具
  8. 分步骤演示如何使用Filter链拦截MyServlet的同一个请求
  9. 计算机naf类型是什么,计算机系统结构课后习题答案
  10. java c static,java-是否可以禁用静态最终变量的javac内联?