在Unix上调试用C编写的优化代码的最好、最简单的方法是什么?
有时我们也没有构建非优化库的代码。
发布于 2009-10-12 11:07:27
这是一个非常好的问题。我在过去遇到过类似的困难,我不得不在我的应用程序中集成第三方工具。根据我的经验,在关联的符号文件中至少需要有有意义的callstack。这只是一个地址和相关函数名的列表。它们通常被剥离,仅从二进制文件中你不会得到它们……如果您有这些符号文件,您可以在启动gdb时或之后通过添加它们来加载它们。如果不是这样,你就会被困在组装级别...
一种奇怪的行为:即使你有源代码,它也会在你意想不到的地方来回跳转(语句可能会被重新排序以获得更好的性能),或者变量不再存在(优化了!),在内联函数中设置断点是没有意义的(它们不在那里,而是它们被内联的地方的一部分)。因此,即使使用源代码,也要注意这些陷阱。
我忘了提一下,符号文件通常有扩展名.gdb,但也可以不同...
发布于 2009-10-13 13:25:07
这个问题与“修理乘用车的最佳方法是什么?”没有什么不同。
在UNIX上调试优化代码的最佳方法取决于您使用的UNIX、可用的工具以及尝试调试的问题类型。
在malloc中调试崩溃与调试unresolved symbol at runtime有很大的不同。
对于一般的调试技术,我推荐使用这个book。
有几件事将使在“程序集级别”进行调试变得更容易:
this指针,哪些寄存器是“调用者保存”的,哪些寄存器是“被调用者保存的”,等等。“并行”调试一个正在运行的程序和一个坏掉的程序通常是有帮助的。如果1.1版可以工作,而1.2版不能工作,那么它们在特定API方面的差异在哪里?在调试器下启动这两个程序,在同一组函数上设置断点,运行这两个程序,观察命中哪些断点以及传递哪些参数的差异。
发布于 2009-10-12 11:21:17
通过相同的接口编写小的代码样本(在它的头中),并调用你的样本而不是优化的代码,比如说模拟,以缩小你调试的代码范围。此外,您可以在您的样本中进行错误注入。
https://stackoverflow.com/questions/1553895
复制相似问题