首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix上的优化代码?

Unix上的优化代码?
EN

Stack Overflow用户
提问于 2009-10-12 10:53:02
回答 3查看 238关注 0票数 2

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

有时我们也没有构建非优化库的代码。

EN

回答 3

Stack Overflow用户

发布于 2009-10-12 11:07:27

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

一种奇怪的行为:即使你有源代码,它也会在你意想不到的地方来回跳转(语句可能会被重新排序以获得更好的性能),或者变量不再存在(优化了!),在内联函数中设置断点是没有意义的(它们不在那里,而是它们被内联的地方的一部分)。因此,即使使用源代码,也要注意这些陷阱。

我忘了提一下,符号文件通常有扩展名.gdb,但也可以不同...

票数 3
EN

Stack Overflow用户

发布于 2009-10-13 13:25:07

这个问题与“修理乘用车的最佳方法是什么?”没有什么不同。

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

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

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

有几件事将使在“程序集级别”进行调试变得更容易:

  • 你应该知道你的平台的调用约定,这样你就可以知道传入和返回什么值,在哪里找到this指针,哪些寄存器是“调用者保存”的,哪些寄存器是“被调用者保存的”,等等。
  • 你应该知道你的操作系统“调用约定”--一个系统调用是什么样子的,系统调用进入哪个寄存器,第一个参数,等等。
  • 你应该“掌握”调试器:知道如何查找线程,如何停止单个线程,如何在单个指令上设置条件断点,单步执行,单步执行或跳过函数调用等。

“并行”调试一个正在运行的程序和一个坏掉的程序通常是有帮助的。如果1.1版可以工作,而1.2版不能工作,那么它们在特定API方面的差异在哪里?在调试器下启动这两个程序,在同一组函数上设置断点,运行这两个程序,观察命中哪些断点以及传递哪些参数的差异。

票数 2
EN

Stack Overflow用户

发布于 2009-10-12 11:21:17

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1553895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档