使用Gdb

作者: 利鹏同学 | 来源:发表于2021-07-16 23:20 被阅读0次

基本语法

调试C程序

  • 一段C代码
#include <stdio.h>

// 对参数 a 和 b 求和
int sum(int a, int b) {
    int s = a + b;
    return s;
}

// main函数:程序入口
int main(int argc, char *argv[]) {
    int n = sum(1, 2); // 调用sum函数对求和
    printf("n: %d\n", n);  //在屏幕输出 n 的值
    return 0;
}
  • 在gdb中我们通过disass main反汇编main函数
[xxx@xxx xxx]$ gdb ./gdb_usecase
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-119.el7
(gdb) disass main
Dump of assembler code for function main:
   0x0000000000400547 <+0>: push   %rbp
   0x0000000000400548 <+1>: mov    %rsp,%rbp
   0x000000000040054b <+4>: sub    $0x20,%rsp
   0x000000000040054f <+8>: mov    %edi,-0x14(%rbp)
   0x0000000000400552 <+11>:    mov    %rsi,-0x20(%rbp)
   0x0000000000400556 <+15>:    mov    $0x2,%esi
   0x000000000040055b <+20>:    mov    $0x1,%edi
   0x0000000000400560 <+25>:    callq  0x40052d <sum>
   0x0000000000400565 <+30>:    mov    %eax,-0x4(%rbp)
   0x0000000000400568 <+33>:    mov    -0x4(%rbp),%eax
   0x000000000040056b <+36>:    mov    %eax,%esi
   0x000000000040056d <+38>:    mov    $0x400620,%edi
   0x0000000000400572 <+43>:    mov    $0x0,%eax
   0x0000000000400577 <+48>:    callq  0x400410 <printf@plt>
   0x000000000040057c <+53>:    mov    $0x0,%eax
   0x0000000000400581 <+58>:    leaveq
   0x0000000000400582 <+59>:    retq
End of assembler dump.

调试Go程序

  • 一段Go代码

package main

//计算a, b的平方和
func sum(a, b int) int {
    a2 := a * a
    b2 := b * b
    c := a2 + b2

    return c
}

func main() {
    sum(1, 2)
}
  • Gdb调试Go可执行程序
# 关闭内联优化
go build -gcflags '-N -l' main.go
# 删除调试符号
  # -s: 去掉符号信息。
  # -w: 去掉DWARF调试信息。
go build -ldflags '-s -w'
[xxx@xxx xxx]$ go build -gcflags '-N -l' main.go
[xxx@xxx xxx]$ gdb main
(gdb) disass main.main
No symbol "main" in current context.
(gdb) l main.main
7       c := a2 + b2
8
9       return c
10  }
11
12  func main() {
13      sum(1, 2)
14  }
(gdb) disass main.main
Dump of assembler code for function main.main:
   0x000000000044f990 <+0>: mov    %fs:0xfffffffffffffff8,%rcx
   0x000000000044f999 <+9>: cmp    0x10(%rcx),%rsp
   0x000000000044f99d <+13>:    jbe    0x44f9cd <main.main+61>
   0x000000000044f99f <+15>:    sub    $0x20,%rsp
   0x000000000044f9a3 <+19>:    mov    %rbp,0x18(%rsp)
   0x000000000044f9a8 <+24>:    lea    0x18(%rsp),%rbp
   0x000000000044f9ad <+29>:    movq   $0x1,(%rsp)
   0x000000000044f9b5 <+37>:    movq   $0x2,0x8(%rsp)
   0x000000000044f9be <+46>:    callq  0x44f930 <main.sum>
   0x000000000044f9c3 <+51>:    mov    0x18(%rsp),%rbp
   0x000000000044f9c8 <+56>:    add    $0x20,%rsp
   0x000000000044f9cc <+60>:    retq
   0x000000000044f9cd <+61>:    callq  0x447840 <runtime.morestack_noctxt>
   0x000000000044f9d2 <+66>:    jmp    0x44f990 <main.main>
End of assembler dump.

调试C 和 Go的差异

C使用 disass main
Go使用 disass main.main

相关文章

  • GDB 配置

    摘要:调试器 GDB 的配置 GDB 配置 使用 GDB 扩展来配置 GDB 事实上我还是觉得原生的 GDB 就...

  • Linux下C++开发常用工具

    gdb 使用gdb的时候, 需要在编译时使用-g命令, 在编译时加入必要的C库gdb + filename进入调试...

  • gdb调试

    使用gdb:编译的时候加 -g 参数 启动gdb:gdb app(对应的可执行程序名) 在gdb启动后:r(un)...

  • GDB入门教程之如何使用GDB启动调试

    原文地址:GDB入门教程之如何使用GDB启动调试|Vim教程网 GDB (The GNU Project Debu...

  • gcc常用命令

    gdb相关 gcc加-g才能使用gdb调试gdb -tui a.out打开调试界面run/stop/continu...

  • Xcode debug Hotspot(一)——创建Xcode项

    概述 前面安装gdb调试hotspot里面,我记录了自己安装gdb调试hotspot的过程。后来我发现,使用gdb...

  • gdb

    gdb调试工具使用

  • 使用Gdb

    基本语法 调试C程序 一段C代码 在gdb中我们通过disass main反汇编main函数 调试Go程序 一段G...

  • GDB使用

  • 使用gdb进行调试

    gcc -g main.c -o main.out 使用-g进行编译后 可以使用gdb进行调试gdb ./ma...

网友评论

      本文标题:使用Gdb

      本文链接:https://www.haomeiwen.com/subject/hdeipltx.html