【发布时间】:2013-04-07 13:32:36
【问题描述】:
假设我有一个导致分段错误的代码。
char * ptr = NULL;
*ptr = "hello"; /* this will cause a segmentation fault */
如何在runtime上打印,发生分段错误的内存地址,以及分段错误的原因(访问禁止的内存区域,或其他)。
我阅读了有关核心转储文件的信息,但我不确定它是否是正确的解决方案。
我该怎么做?
PS,我知道我可以通过使用 gdb 或其他调试器来实现这一点,但目的是通过使用代码来做到这一点,而且只有代码。 p>
【问题讨论】:
-
您可以使用
backtrace函数。但我真的建议你在调试器中运行你的程序,它不仅可以让你看到回溯,还可以向上调用堆栈并检查变量。 -
“阅读核心转储文件” - 我强烈推荐它们。它们将所有内容转储到内存中,然后您可以使用
gdb和正确的可执行文件打开它们。这将使您有机会查看到底发生了什么(除非内存没有搞砸,但这是非常罕见的情况) - 查看任何变量的值、回溯、线程等(当然,最好有最大调试级别,并且没有针对此类调查进行优化) -
hmm..
*ptr的类型是char,但"hello"的类型是char*。您可能应该指定一个字符 (*ptr = 'h';) 或使用memmove()或类似的字符,以使示例正确。实际上,它获取字符串常量的地址,将其转换为整数,将其缩减为 1 个字节,然后将其分配给*ptr -
C/C++ 不像 Java,所以你必须使用 gdb 并分析转储的核心。
-
看在上帝的份上,请不要。您期望什么附加价值?与核心转储和调试器相比,您所做的任何事情都会受到更多限制。此外,尝试“处理”此类错误(如果仅用于诊断输出)是让您的流程陷入更深层次问题的好方法,甚至可能隐藏真正的错误(在生产应用程序中见过几次)。跨度>
标签: c linux unix segmentation-fault