c – 调试在Customer框中生成的核心文件
我们从客户的盒子上运行我们的软件获得核心文件.不幸的是因为我们总是使用-O2进行编译而没有调试符号,这导致我们无法弄清楚它崩溃的原因,我们已经修改了构建,所以它们现在一起生成-g和-O2.然后,我们建议客户运行-g二进制文件,以便更容易调试. 我有几个问题: >从Linux发行版生成核心文件而不是我们在Dev中运行的文件时会发生什么?堆栈跟踪是否有意义? 这是一个崩溃的例子,要求我们告诉客户获得-g ver.二进制文件:
理想情况下,我想解决一下为什么应用程序崩溃的原因 – 我怀疑它是内存损坏,但我不是100%肯定. 严格禁止远程调试. 谢谢 最佳答案
可执行文件是动态链接的,就像你的那样,GDB产生的堆栈(很可能)没有意义. 原因是:GDB知道您的可执行文件是通过调用地址0x00454ff1中的libc.so.6中的内容而崩溃的,但它不知道该地址的代码是什么.所以它会查看你的libc.so.6副本并发现它在select中,所以它打印出来. 但是,客户副本libc.so.6中0x00454ff1也处于选择状态的可能性非常小.很可能客户在该地址有一些其他程序,也许是中止. 您可以使用disas select,并观察0x00454ff1是在指令的中间,还是前一条指令不是CALL.如果其中任何一个成立,则堆栈跟踪无意义. 但是,您可以自助:您只需获取从客户系统共享的(gdb)信息中列出的所有库的副本.让客户通过例如
然后,在您的系统上:
一个更好的方法是: >使用-g -O2 -o myexe.dbg构建 您将拥有完整的符号信息(文件/行,本地变量),而无需向客户发送特殊二进制文件,也不会泄露有关您的源的太多详细信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |