【gdb】- 单步执行和跟踪函数调用

本文介绍了如何使用gdb进行C程序的单步执行和函数调用跟踪。通过编译带有-g选项的源码,利用gdb的list、next、step、backtrace等命令查看源代码、逐行执行并检查函数调用栈和局部变量的值,以发现和解决程序中的错误。在示例中,通过调试发现并修复了因局部变量未初始化导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作环境:

[root@localhost zhangsan]# cat /proc/version 
Linux version 2.6.32-696.el6.x86_64 (mockbuild@c1bm.rdu2.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Mar 21 19:29:05 UTC 2017

编译安装gdb

[root@localhost zhangsan]# wget http://ftp.gnu.org/gnu/gdb/gdb-7.6.1.tar.gz
[root@localhost zhangsan]# tar -zxvf gdb-7.6.1.tar.gz
[root@localhost zhangsan]# cd gdb-7.6.1
[root@localhost gdb-7.6.1]# ./configure 
[root@localhost gdb-7.6.1]# make
[root@localhost gdb-7.6.1]# make install
[root@localhost gdb-7.6.1]# cp /home/zhangsan/gdb-7.6.1/gdb/gdb /usr/bin/gdb     //将编译好的gdb拷贝到/usr/bin目录中
[root@localhost gdb-7.6.1]# gdb -v          //查看安装是否成功
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

单步执行和跟踪函数调用

 函数调试实例:

#include <stdio.h>

int add_range(int low, int high)
{
        int i,sum;
        for (i = low; i <=  high; i++)
                sum = sum + i;
        return sum;
}

int main(void)
{
        int result[100];
        result[0] = add_range(1, 10);
        result[1] = add_range(1,100);
        printf("result[0]= %d\nresult[1]=%d\n", result[0],result[1]);
        return 0;
}
[zhangsan@localhost study-c]$ gcc -Wall -g gdb1.c -o gdb1
[zhangsan@localhost study-c]$ ./gdb1 
result[0]= 55
result[1]=5105

可见result[1]=5105显然是不正确的,在编译时要加上-g选项,生成的可执行文件才能用gdb进行源码级调试:

[zhangsan@localhost study-c]$ gdb gdb1
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are fre
<think>嗯,用户想知道如何在GDB中进行单步执行的源码调试。我需要根据提供的引用内容来整理步骤方法。首先,引用2提到使用Emacs配合GDB进行调试,但用户可能不需要Emacs的具体操作,而是更关注GDB本身的命令。 然后,引用2引用3中提到设置断点、启用汇编显示、使用sini命令。用户的问题是关于源码调试,所以可能需要区分C源码的单步汇编级别的单步。需要明确sn是源码级别的单步,而sini是指令级别的。 引用3解释了单步调试的原理,涉及TRAP位调试异常,这部分可能对用户理解原理有帮助,但用户主要需要操作步骤。引用4提到了单步调试网络结构的过程,但可能不直接相关。 接下来,整理步骤:首先编译时加-g选项,启动GDB,设置断点,然后使用sn进行源码单步,sini用于汇编单步。同时,设置显示汇编寄存器信息可能有帮助。另外,如何查看变量调用栈也是调试的一部分。 需要确保回答结构清晰,分步骤说明,并引用相关的引用内容。可能的问题包括如何查看变量,如何处理多线程调试,但用户当前的问题集中在单步执行源码调试,所以主要回答这部分。最后生成相关问题,如优化单步调试、处理多线程等。</think>### GDB单步执行源码调试方法 #### 1. 编译时添加调试信息 在编译程序时需使用 `-g` 选项生成调试符号: ```bash gcc -g test.c -o test ``` 这会保留变量名、函数名源码行号等调试信息[^2]。 #### 2. 启动GDB调试器 ```bash gdb ./test ``` #### 3. 设置断点 ```gdb (gdb) b main # 在main函数设置断点 (gdb) b 10 # 在第10行设置断点 ``` #### 4. 单步调试命令 | 命令 | 功能描述 | 层级 | |---------|-----------------------------------|------------| | `s` | 进入函数内部(源码级单步) | C源码级别 | | `n` | 执行下一行代码(不进入函数) | C源码级别 | | `si` | 执行一条机器指令并进入函数调用 | 汇编级别 | | `ni` | 执行一条机器指令但不进入函数调用 | 汇编级别 | #### 5. 查看调试信息 ```gdb (gdb) display $pc # 显示当前程序计数器 (gdb) display/i $pc # 显示对应汇编指令 (gdb) set disassemble-next-line on # 显示即将执行的汇编代码 ``` 此时会同时显示C源码对应的汇编指令。 #### 6. 寄存器监控 通过以下命令查看寄存器状态: ```gdb (gdb) info registers (gdb) p $rax # 查看特定寄存器值 ``` #### 7. 查看源码上下文 ```gdb (gdb) list # 显示当前执行位置附近的源码 (gdb) layout src # 开启源码窗口模式 ``` #### 原理说明 GDB通过设置处理器的TRAP标志位,使CPU在每条指令执行后触发调试异常,从而实现单步执行功能。这种机制允许在每条指令/语句执行后暂停程序,检查寄存器内存状态[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值