从 C++ 到 Pro *C 的控制转换期间的分段错误
Posted
技术标签:
【中文标题】从 C++ 到 Pro *C 的控制转换期间的分段错误【英文标题】:Segmentation fault during Transition of Control from C++ to Pro *C 【发布时间】:2009-07-24 09:27:15 【问题描述】:我编写了一个小型 Pro *C/C++ 应用程序 [多线程,守护进程],我使用 Pro *c 获取一些 DB 记录,然后调用 C++ 函数生成 XML 文件,这些文件通过套接字发送到第三个派对。
问题在于,当调用 c++ 函数时,它正在正确生成 xml 文件,但在将控制从 C++ 转换回 Pro *C 期间以 Sig 11 错误结束。在这里,我没有任何返回参数,而且 C++ 函数的所有参数都是常量参数。
问题是随机出现的。因此,在生成了几个 xml [它们是从相同的代码生成的]之后。错误不是恒定的。 因此,在生成 1 或 2 个 xml 文件后,第一次运行时,第二次运行时会生成 5 个 xml,有时会在生成 1 个 xml 之后。
因此,不确定它是否与任何代码问题有关,因为它正在正确生成 xml 文件,而是堆栈展开/堆栈损坏问题。
这方面的任何一点,都会有很大帮助。
另外,我正在使用 C++ 编译器开发 HP Itanium。
这是函数声明及其调用方式:
/* ------------ Pro *C : ------ */
GenerateXML(Mic_Prov_Queue_List, Prov_Service_Params_Info, iThreadId);
/* Declaration : ----------- */
#ifdef __cplusplus extern "C"
void GenerateXML(const Mic_Prov_List *Mic_Prov_Queue_List, const Mic_Prov_Service_Params_info_x_t * Prov_Service_Params_Info, int iThreadId);
#ifdef __cplusplus
问候 Roopesh Majeti。
【问题讨论】:
我们需要看一些代码——至少是 C++ 函数的声明以及你是如何调用它的。 这里是 : ------------ Pro *C : ------ GenerateXML(Mic_Prov_Queue_List, Prov_Service_Params_Info, iThreadId);声明: ----------- #ifdef __cplusplus extern "C" void GenerateXML(const Mic_Prov_List *Mic_Prov_Queue_List, const Mic_Prov_Service_Params_info_x_t * Prov_Service_Params_Info, int iThreadId); #ifdef __cplusplus 请将代码编辑到您的问题中,并进行适当的格式化。 不好意思问,你能建议一下,怎么做?我尝试使用“检查元素”选项,但找不到方法。抱歉打扰了,如果是的话。 希望没有踩到 Roopesh 的脚趾,我将其添加到问题的主体中。 【参考方案1】:很有可能您的 GenerateXML 函数正在写入超出缓冲区的范围并丢弃堆栈 - 特别是返回地址。在这种情况下,XML 输出看起来没问题,但一旦返回它就会崩溃,这并不奇怪。
我敢打赌,在 GenerateXML 中声明的前几个变量中是某种缓冲区或数组?
编辑:
(OP已经在cmets中指出GenerateXML中确实声明了一个大小为1000的char缓冲区)
是的,如果您将超过 1000 个字节写入该缓冲区(即写入位置缓冲区 [1000] 或更高),那么您将破坏事物 - 在您的情况下,您似乎正在破坏函数返回值。
要找出代码在哪里,这很困难。您有几个选择:
手动检查代码并尝试找到它发生的地方; 在每次访问 buffer[n] 之前分散 assert(n 在调试器下运行,在缓冲区[999]上设置观察点,然后在观察点触发后单步查看何时访问缓冲区[1000]; 在 valgrind 或 Purify 等代码分析工具下运行它。【讨论】:
这是真的,我有一个 char 缓冲区声明并使用它。但它的大小只有 1000 字节。但我敢打赌,它不应该造成崩溃/覆盖堆栈返回地址。可以 ?如果是这样,我们如何确保不会发生这样的事情。 如果你写入超过 1000 个字节,它肯定会。你应该仔细检查代码,看看你缺少边界检查的地方,让同事检查代码,如果一切都失败了,在分析工具(如 valgrind 或 Purify)下运行你的程序。 只是一个问题。函数将具有的参数 [或缓冲区,而是] 是否有任何限制。根据您的陈述,您说:“如果您在其中写入超过 1000 个字节,它肯定会”。你能解释一下吗,多一点或指向任何有相同信息的网络链接。提前致谢。问候 Roopesh M. 有一个限制,但除非您在一个非常受限的系统(例如嵌入式系统)上工作,否则 1000 字节应该没问题。我的意思是,如果你的缓冲区被声明为“char buffer[1000]”,那么绝对不能写在“buffer[999]”之上。那是你的问题。 实际上,你是对的,我声明了一个 1000 的缓冲区,但几乎没有使用 10-30 个元素。如果您想分析它,我可以分享该程序。以上是关于从 C++ 到 Pro *C 的控制转换期间的分段错误的主要内容,如果未能解决你的问题,请参考以下文章