使用 GCC 调试程序

系统 Ubuntu

调试示例:

#include <stdio.h>

int func(int n)
{
int sum=0,i;
for(i=0;i<n;i++)
{
sum+=i;
}
return sum;
}

main()
{
int i;
long result = 0;
for(i=1;i<100;i++)
{
result += i;
}

printf("result[1-100] = %d \n",result);
printf("result[1-250] = %d \n",func(250));
}

编译生成执行文件:

gcc -g tst.c -o tst 

-g :生成调试信息,将调试信息加载到可执行文件中

-o tst : 确定输出文件的名称为 tst ,默认为 a.out , 不可与源文件重名

打断点:

b n             // b 代表break , n 代表行号。在某一行打断点

b function   // function 函数,在某个函数处打断点

info b         // 打印断点信息

运行程序:

r    // run 

以上程序停在了断电处

打印变量值:

p  i      // 打印变量 i 的值

查看函数堆栈:

bt   // 

清除程序断点:

d    // 清除程序断点 delete

单步跟踪:

s  // 运行一行程序,且能够进入函数

n  // 运行一行程序,且不能进入函数

显示源程序:

list n  // 显示第n行周围的源程序

list function  // 显示函数名为 function 的函数的源程序

list  // 显示当前行后面的源程序

list  -   // 显示当前行前面的源程序

查看源代码内存:

info line  // 查看源代码在内存中的地址;后面跟 行号 、 函数名 、 文件名:行号 、 文件名:函数名

disassemble (disass)  // 查看源程序当前执行时的机器码

查看内存:

exmaine (x)  // 查看内存中地址的值

x/<n/f/u> <addr>
  n、f、u 是可选的参数。
  n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
  f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令
  地址,那么格式可以是i。
  u 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是4
  个bytes。u 参数可以用下面的字符来代替,b 表示单字节,h 表示双
  字节,w 表示四字节,g 表示八字节。当我们指定了字节长度后,
  GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一
  个值取出来。
  <addr>表示一个内存地址。

查看寄存器:

info r (registers)  // 查看寄存器的情况(除了浮点寄存器)

 

转载于:https://www.cnblogs.com/tf-Y/p/4924444.html

使用gcc和make调试程序的原理涉及到编译、链接和调试几个关键步骤。以下是大致的调试程序的原理: 1. 编写源代码:首先需要编写源代码,使用C或C++等编程语言编写程序。 2. 编译源代码:使用gcc编译器将源代码编译成可执行文件。编译过程中会将源代码转换为机器代码,并生成目标文件。 3. 链接目标文件:链接器将目标文件和系统库文件进行链接,生成最终的可执行文件。在链接过程中会解析函数引用、地址重定向等操作。 4. 添加调试信息:通过在编译时添加调试信息选项,如-g参数,可以在可执行文件中包含调试符号表和源代码映射关系。 5. 使用调试器:使用调试器,如gdb,加载可执行文件,并设置断点或其他调试指令。调试器提供了一系列工具和命令,可以单步执行程序、查看变量值、检查堆栈等。 6. 调试过程:在调试过程中,可以通过断点来暂停程序的执行,并逐步跟踪代码。可以观察变量的值、检查函数调用和返回,以及查看程序的状态。 7. 调试输出:在调试过程中,可以使用调试器提供的输出功能,如打印变量的值、显示调试信息等。 8. 修复问题:根据调试过程中的观察和分析,可以定位和修复程序中的问题,如逻辑错误、内存泄漏等。 9. 重新编译和调试:在修复问题后,可以重新编译程序,并使用调试器再次进行调试,以确认问题是否已解决。 总体来说,使用gcc和make调试程序的原理是通过编译、链接和使用调试器来定位和修复代码中的问题。调试器提供了一系列功能和命令,帮助开发人员探查程序的执行情况,以解决bug和改进代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值