GDB调试release程序

来源:互联网 发布:知乎怎么匿名回复 编辑:程序博客网 时间:2024/06/01 10:51

方法1:  如果现在有同一个工程构建出的Debug版和Release版可执行文件projectD和projectR,如下的命令可以帮助你把Debug版中的符号表加到Release版中,实现对Release版的调试。用发布时的原代码,在原有的编译选项上(不要改变任何编译参数,即使有"-O2"参数,也不要动),只加上"-g"选项,编译出对应的debug程序。

  1、objcopy --only-keep-debug projectD projectsymbol.dbg #生成符号表;

  2、gdb -q --symbol=projectsymbol.dbg -exec=projectR #加载符号表;

  这下在gdb中就可以看到源代码了。


方法2: 在编译发布版本时加上"-g -O2",  这样就有符号表了, 而且不影响性能。


程序运行过程中发生异常退出时,系统会把程序当前的内存情况存储在一个core文件中。由于没有足够的现场日志,异常发生的原因通常难于查找。这种情况可以用core文件配合gdb来解决。
造成 segment fault,产生 core dump 的可能原因 , 
1、内存访问越界 、 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用 结束符 c) 使用 strcpy, strcat, sprintf, strcmp, strcasecmp 等字符串操作函数,将目标字符串读/写 爆。应该使用 strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp 等函数防止 读写越界。 
2、多线程程序使用了线程不安全的函数。 、多线程程序使用了线程不安全的函数。 
3、多线程读写的数据未加锁保护。 、多线程读写的数据未加锁保护。 对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成 core dump 
4、非法指针 、 a) 使用空指针 b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结 构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应 该将这段内存拷贝到一个这种结构或类型中, 再访问这个结构或类型。 这是因为如果这段内 存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为 bus error 而 core dump. 
5、堆栈溢出 、 不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统 的栈和堆结构,导致出现莫名其妙的错误。


gdb查看内存地址和栈中的值

gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式
     x/ (n,f,u为可选参数)
n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义
f:显示格式
               x(hex) 按十六进制格式显示变量。
               d(decimal) 按十进制格式显示变量。
               u(unsigned decimal) 按十进制格式显示无符号整型。
               o(octal) 按八进制格式显示变量。
               t(binary) 按二进制格式显示变量。
               a(address) 按十六进制格式显示变量。
               c(char) 按字符格式显示变量。
               f(float) 按浮点数格式显示变量
u:每个单元的大小,按字节数来计算。默认是4 bytes。GDB会从指定内存地址开始读取指定字节,并把其当作一个值取出来,并使用格式f来显示
               b:1 byte     h:2 bytes     w:4 bytes g:8 bytes
     比如x/3uh 0x54320表示从内存地址0x54320读取内容,h表示以双字节为单位,3表示输出3个单位,u表示按照十六进制显示。
    from http://www.cnblogs.com/super119/archive/2011/03/26/1996125.html

gdb打印表达式的值:print/f 表达式

f是输出的格式,x/d/u/o/t/a/c/f

表达式可以是当前程序的const常量,变量,函数等内容,但是GDB不能使用程序中所定义的宏

查看当前程序栈的内容: x/10x $sp-->打印stack的前10个元素
查看当前程序栈的信息: info frame----list general info about the frame
查看当前程序栈的参数: info args---lists arguments to the function
查看当前程序栈的局部变量: info locals---list variables stored in the frame
查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
查看当前栈帧中的异常处理器:info catch(exception handlers)
from http://blog.chinaunix.net/uid-29062294-id-4255572.html


0 0
原创粉丝点击