GDB再学习(4):程序准备


在使用GDB调试程序前,还需要对我们编写的程序做一些准备工作,这样可以使我们的程序在出现错误的时候呈现出更多的细节。

我们使用如下测试程序进行说明:

#include <stdio.h>
#include <string.h>

int test2()
{
    
    
	char* s8Buf = NULL;
	
	strcpy(s8Buf, "8888");
	
	return 0;
}

int main()
{
    
    
	test2();
	
	return 0;
}

上面的程序中s8Buf 为空指针,直接对空指针进行赋值,会导致段错误。

1 增加-ggdb编译选项

在编译程序时候,使用-ggdb会产生GDB所需要的调试信息。
当然,如果编译选项中有-g/-g3等参数也可以达到这个效果。

下面就对上面的程序进行编译,通过对比来查看添加这个选项和不添加有什么不一样的效果。

1.1不加此选项调试信息

编译:

gcc test_gdb.c -o test

运行:
在这里插入图片描述

如图,上面有两个红框:
第1个红框提示“no debugging symbols found”没有调试相关的符号;
第2个红框中,我们的程序出现了段错误,但是并没有提示具体是函数哪里出现的段错误。

1.2 添加此选项的调试信息

编译:

gcc test_gdb.c -o test -ggdb

运行:
在这里插入图片描述

如上图:
第1个红框提示读到了调试相关的符号;
第2个红框提示段错误是由那个函数哪一行或者哪一个语句引起的,很容易就定位到错误。

2 不要strip

strip的作用就是将程序中的一些符号信息和调试信息去掉,不影响程序的正常运行,但是会减小程序的体积。

特别是在一些存储空间有限的嵌入式设备中,使用strip能大大减小程序的体积,但是这样做就会导致使用GDB调试无法获取到详细信息,因此可以在调试时候不要strip,在发布程序时候选择是否strip。

3 不要-O/-O2/-O3

有些项目在编译代码时候,会加上-O/-O2/-O3等选项来让编译器对代码进行优化,但这样做的后果可能会过滤掉部分或者全部的调试信息,甚至获取到的调试信息不是程序真正异常的地方,很容易被误导。所以,在debug程序时候,可以去掉这些编译参数。

猜你喜欢

转载自blog.csdn.net/u011003120/article/details/109814538
今日推荐