前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gdb工具的简单使用

gdb工具的简单使用

作者头像
用户2825413
发布2019-07-16 10:56:57
4220
发布2019-07-16 10:56:57
举报

打了一周末的王者,终于上了星耀.但是还是百忙之中,小妲己抽空谢写了一些操作步骤。


gdb工具是个很有用的工具.经常用于我们项目的调试使用。

首先我们来启动一个镜像:

代码语言:javascript
复制
docker run -it --privileged=true thrift/new  /bin/bash

1. 我们看下今天要分析的代码:

代码语言:javascript
复制
#include "stdio.h"

int getSum(int param_one,int param_two)
{
   return param_one+param_two;
}

int main()
{
   int a = 10;
   int b = 5;
   int sum = getSum(a,b);
   printf("%d",sum);
}

使用gcc编译:

代码语言:javascript
复制
gcc -g -o test test.c

加上 -g 选项即为了程序编译后的程序中保留调试符号信息

如果发布代码的话,可以使用命令来移除调试符号信息:

代码语言:javascript
复制
strip test

2. gdb 实操

函数级别断点
代码语言:javascript
复制
gdb test

#break指令  在main函数处断点
b main

#在getSum函数处断点
b getSum

接下来我们看下执行流程:

代码语言:javascript
复制
#run  r命令重启程序将在断点处停下
r

Breakpoint 1, main () at test.c:10
10       int a = 10;
代码语言:javascript
复制
#continue 继续向下执行
c 

Breakpoint 2, getSum (param_one=10, param_two=5) at test.c:5
5       return param_one+param_two;

我们看到已经执行到我们的第二个断点上来了。

当然,还有更加灵活的断点方式,具体到我们的代码某行.

代码语言:javascript
复制
#在我们的例子代码中,断点第五行代码
b test.c:5

Breakpoint 1 at 0x400527: file test.c, line 5.

#运行run
r
Breakpoint 1, getSum (param_one=10, param_two=5) at test.c:5
5       return param_one+param_two;

断点是为了更好的调试我们的程序, 但是我们发现这样调试来信息还是比较少, 如果想了解调用的堆栈信息, 我们继续看下面的指令

backtrace 命令(简写为 bt)

代码语言:javascript
复制
(gdb)b test.c:5

(gdb)r

(gdb) bt
#0  getSum (param_one=10, param_two=5) at test.c:5
#1  0x0000000000400556 in main () at test.c:12

我们看到了调用的堆栈信息 main()->getSum()

函数调用为栈的数据结构存储形式

我们看到只有两层栈的调用,我们可以使用frame切换到指定的栈.

代码语言:javascript
复制
#frame 堆栈编号
f 1

#1  0x0000000000400556 in main () at test.c:12
12       int sum = getSum(a,b);

我们可以看到具体的调用方式

当我们断点或切换到某个堆栈的时候,还想更详细的看当前断点代码
代码语言:javascript
复制
# list l 当前断点处的代码

#切换栈
(gdb) f 1

(gdb) l
8    int main()
9    {
10       int a = 10;
11       int b = 5;
12       int sum = getSum(a,b);
13       printf("%d",sum);
14    }
查看当前运行的变量值(print)
代码语言:javascript
复制
#打印params_two的值
p params_two 
$1 = 10

我们还可以手动修改当前运行变量

代码语言:javascript
复制
p params_two=50
查看我们打了哪些断点
代码语言:javascript
复制
info b

Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400539 in main at test.c:10
2       breakpoint     keep y   0x0000000000400527 in getSum at test.c:5

禁用/启用某个断点

代码语言:javascript
复制
disable 断点编号
enable 断点编号
使用delete命令删除断点
代码语言:javascript
复制
(gdb) delete

Delete all breakpoints? (y or n) y
查看断点的汇编指令
代码语言:javascript
复制
(gdb) disassemble

Dump of assembler code for function main:
   0x0000000000400531 <+0>:    push   %rbp
   0x0000000000400532 <+1>:    mov    %rsp,%rbp
   0x0000000000400535 <+4>:    sub    $0x10,%rsp
=> 0x0000000000400539 <+8>:    movl   $0xa,-0x4(%rbp)
   0x0000000000400540 <+15>:    movl   $0x5,-0x8(%rbp)
   0x0000000000400547 <+22>:    mov    -0x8(%rbp),%edx
   0x000000000040054a <+25>:    mov    -0x4(%rbp),%eax
   0x000000000040054d <+28>:    mov    %edx,%esi
   0x000000000040054f <+30>:    mov    %eax,%edi
   0x0000000000400551 <+32>:    callq  0x40051d <getSum>
   0x0000000000400556 <+37>:    mov    %eax,-0xc(%rbp)
   0x0000000000400559 <+40>:    mov    -0xc(%rbp),%eax
   0x000000000040055c <+43>:    mov    %eax,%esi
   0x000000000040055e <+45>:    mov    $0x400600,%edi
   0x0000000000400563 <+50>:    mov    $0x0,%eax
   0x0000000000400568 <+55>:    callq  0x400400 <printf@plt>
   0x000000000040056d <+60>:    leaveq 
   0x000000000040056e <+61>:    retq   
End of assembler dump.
使用watch监控某个变量的变化
代码语言:javascript
复制
(gdb) b main 

(gdb) r

(gdb) watch sum

Old value = 32767
New value = 15
main () at test.c:13
13       printf("%d",sum);

先到这里吧, 等接下来有空我们再研究下多进程的代码如何使用gdb调试。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 呆呆熊的技术路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 我们看下今天要分析的代码:
  • 2. gdb 实操
    • 函数级别断点
      • 当我们断点或切换到某个堆栈的时候,还想更详细的看当前断点代码
        • 查看当前运行的变量值(print)
          • 查看我们打了哪些断点
            • 使用delete命令删除断点
              • 查看断点的汇编指令
                • 使用watch监控某个变量的变化
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档