2009-10-12 64 views
2

什么是最好的和最简单的方法来调试优化的代码在Unix上编写的C?Unix上的优化代码?

有时我们还没有构建未优化库的代码。

+0

优秀的整合问题。 – whatnick 2009-10-12 11:59:01

回答

3

这是一个非常好的问题。过去,我不得不在我的应用程序中集成第三方工具,但我也遇到过类似的困难。根据我的经验,您需要在关联的符号文件中至少包含有意义的调用堆栈。这仅仅是地址和相关函数名称的列表。这些通常会被剥离,从二进制文件中你不会得到它们......如果你有这些符号文件,你可以在启动gdb或之后添加它们来加载它们。如果不是这样,你就会陷入汇编级别......

一个奇怪的行为:即使你有源代码,它会在你不期待的地方跳来跳去(语句可能会被重新排序为了获得更好的性能)或变量不再存在(优化离开!),在内联函数中设置断点是毫无意义的(它们不在那里,而只是它们内联的一部分)。所以即使有源代码,也要注意这些陷阱。

我忘了提,符号文件的扩展名通常.GDB,但也可以是不同的...

0

通过相同的接口写的小代码样本(在它的头的东西),并调用您的样品而不是那个优化的代码,比如说模拟,来缩小你调试的代码范围。此外,您可以在样本中进行错误注射。

+0

是的,但如果它包含几百个用于构建一个可执行文件的c文件,并且我正在调试该可执行文件,那么会导致头疼:( – Vijay 2009-10-12 11:31:41

+0

样本大小(总共有多少行)取决于您,现在您可以使用debuger(即gdb),因为拥有所有的源代码。 – Test 2009-10-12 12:36:39

2

这个问题不像“修理乘用车的最佳方法是什么?”

在UNIX上调试优化代码的最佳方法取决于您具有哪个UNIX,您有哪些可用的工具以及您尝试调试的问题类型。

malloc中调试崩溃与调试unresolved symbol at runtime有很大不同。

对于一般的调试技术,我推荐这个book

几件事情会更容易在“集结号级别”调试:

  • 你应该知道呼叫 约定的平台,让你 能告诉什么是传递 和返回值,在哪里可以找到指针,哪些寄存器是“主叫保存”的,哪些是“被保存的”,等等。
  • 你应该知道你的操作系统“调用约定” - 系统调用是什么样的,哪个寄存器系统调用号码,第一个参数等。
  • 你应该 “大师”的调试器:知道如何 找到线程,如何阻止个别 线程,如何设置单独的指令,单步条件 断点,单步或跳过函数调用, 等等。

它通常有助于“并行”调试工作程序和破损程序。如果版本1.1工作,版本1.2不工作,那么他们在特定的API方面有什么分歧?在调试器下启动这两个程序,在同一组函数上设置断点,运行这两个程序并观察哪些断点被击中的差异以及传递哪些参数。

+0

我通常会遇到一个崩溃问题,我正在AIX平台上工作。在我的工作环境中,只有dbx可用。有时它会显示错误的行号值和有时候,我会在函数调用中看到soem垃圾值。这让我很困惑。 – Vijay 2009-10-14 05:10:23