Linux GDB调试实战案例解析

linux gdb调试例子

时间:2024-12-12 19:21


Linux GDB调试实例详解 在Linux系统下,GNU Debugger(GDB)是一款功能强大的调试工具,广泛应用于C、C++及其他编程语言的程序调试

    GDB能够帮助开发者在程序运行时监控每一个细节,包括变量的值、函数的调用过程、内存中的数据以及线程的调度等,从而快速定位和修复隐藏的错误或低效的代码

    本文将通过具体的实例,详细介绍如何使用GDB进行程序调试

     一、GDB安装与准备 大多数Linux发行版都预装了GDB

    如果没有安装,可以使用包管理器进行安装

    例如,在Debian/Ubuntu系统上,可以使用以下命令安装: sudo apt-get install gdb 在CentOS/RHEL系统上,可以使用以下命令: sudo yum install gdb 而在Fedora系统上,则使用: sudo dnf install gdb 在使用GDB进行调试之前,需要在编译程序时添加`-g`选项,以包含调试信息

    例如,编译一个名为`start.c`的C程序: gcc start.c -o start -g 二、GDB基本命令 GDB提供了丰富的命令,用于程序的调试

    以下是一些常用的GDB命令: - `list`(或`l`):查看源码

     - `run`(或`r`):运行程序

     - `break`(或`b`):设置断点

     - `info break`:查看断点信息

     - `next`(或`n`):单步执行,不进入函数内部

     - `step`(或`s`):单步执行,进入函数内部

     - `print`(或`p`):打印变量的值

     - `continue`(或`c`):继续执行程序,直到遇到下一个断点

     - `finish`:执行到当前函数返回,然后停下来等待命令

     - `quit`(或`q`):退出GDB

     三、GDB调试实例 1. 调试一个简单的程序 首先,我们来看一个简单的C程序`start.c`: include int main() { int s = 0; for(int i = 1; i <= 1;i++){ s = i + s; } printf(%d , s); return 0; } 编译并运行GDB: gcc start.c -o start -g gdb start 进入GDB调试环境后,可以使用以下命令进行调试: (gdb) list //列出源码 1 #include 2 3 4 5 intmain() 6 { 7 8 int s=0; 9 for(int i=1;i<=1;i++) 10{ (gdb) list 11 12 s=i+s; 13} 14 15 printf(%d ,s); 16 17 return 0; 18} (gdb) break 9 //设置第9行为断点 Breakpoint 1 at 0x115c: file start.c, line 9. (gdb) info break //显示断点信息 Num Type Disp Enb Address What 1 breakpoint keep y 0x000000000000115c in main at start.c:9 (gdb) run //运行程序 Starting program: /home/clc/program/start 【Thread debugging using libthread_dbenabled】 Using host libthread_db library /lib/x86_64-linux-gnu/libthread_db.so.1. Breakpoint 1,main () at start.c:9 9 for(int i=1;i<=1;i++) (gdb) next //在第一个断点处停止,n相当于next,单步执行 12 s=i+s; (gdb) next 9 for(int i=1;i<=1;i++) (gdb) print s //显示变量的值 $1 = 1 (gdb) next 15 printf(%d ,s); (gdb) next 17 return 0; (gdb) next 18} (gdb) continue //继续执行 Continuing. 【Inferior 1 (process 5136 exited normally】 (gdb) quit 通过这个简单的实例,我们了解了如何在GDB中设置断点、单步执行和查看变量的值

     2. 调试一个包含错误的程序 接下来,我们来看一个包含错误的C程序`bug.c`: include include include int main() { int i, len; charstr【】 = hello; charrev_string; len = strlen(str); rev_string= (char )malloc(len + 1); printf(%s , str); for(i = 0; i < len;i++){ rev_string【len - i】 =str【i】; } rev_string【len + 1】 = 0; // 错误:应该是 rev_string【len】 = 0; printf(the reverse string is %sn,rev_string); return 0; } 编译并运行GDB: gcc bug.c -o bug -g gdb bug 进入GDB调试环境后,可以使用以下命令进行调试: (gdb) list 1 #include 2 #include 3 #include 4 intmain()