当前位置: 技术问答>linux和unix
关于core调试
来源: 互联网 发布时间:2016-05-30
本文导语: 因为项目release的时候使用了-g -O2选项 编译出来的程序core dump的时候产生的堆栈信息不能完整的反应出来信息, 很多的变量无法在打印出来,应该是编译器优化合并变量造成的,我用是objcopy --only-keep-debug 导出的...
因为项目release的时候使用了-g -O2选项 编译出来的程序core dump的时候产生的堆栈信息不能完整的反应出来信息,
很多的变量无法在打印出来,应该是编译器优化合并变量造成的,我用是objcopy --only-keep-debug 导出的符号表 有没有办法在不改变编译选项的情况下产生信息
很多的变量无法在打印出来,应该是编译器优化合并变量造成的,我用是objcopy --only-keep-debug 导出的符号表 有没有办法在不改变编译选项的情况下产生信息
|
如果是linux,沒辦法的,linux的coredump文件包含的調試信息少,只能重新編譯patch,生成一個debug版本的,
然後用gcc載入core文件和那個debug版本的patch,然後定位到core dump的位置查找原因
如果是Solaris的系統,就不需要重新編譯debug版本的patch了,因為Solaris採用了增強型的coredump文件,可
以直接用mdb來調試了
然後用gcc載入core文件和那個debug版本的patch,然後定位到core dump的位置查找原因
如果是Solaris的系統,就不需要重新編譯debug版本的patch了,因為Solaris採用了增強型的coredump文件,可
以直接用mdb來調試了
|
有些编译器在加了-O之后-g就没用了,不过gcc编译器倒是允许-g的同时使用-O,产生的结果可能会比较奇怪。 参考gcc说明:
GCC allows you to use -g with -O. The shortcuts taken
by optimized code may occasionally produce surprising
results: some variables you declared may not exist at
all; flow of control may briefly move where you did not
expect it; some statements may not be executed because
they compute constant results or their values were
already at hand; some statements may execute in
different places because they were moved out of loops.