Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何排除仅在客户端上发生的非法内存访问崩溃';s系统?_C++_Windows_Debugging - Fatal编程技术网

C++ 如何排除仅在客户端上发生的非法内存访问崩溃';s系统?

C++ 如何排除仅在客户端上发生的非法内存访问崩溃';s系统?,c++,windows,debugging,C++,Windows,Debugging,我正在尝试解决我们的应用程序的一个问题,该问题只发生在属于我们客户之一的特定服务器上 应用程序有时会崩溃,核心文件显示非法内存访问。我怀疑原因是malloc函数出现了某种故障。它可能返回空指针,但当这种情况发生时,机器仍然有大量的可用内存。我的理论是,内存太分散了,当它试图分配更多内存(18MB)时,可能失败了 我可以采取哪些步骤来解决此问题?例如,当内存分配失败时,Windows是否记录任何信息?或者它只是忽略了它 有问题的服务器正在运行Windows server 2008 R2,并且Win

我正在尝试解决我们的应用程序的一个问题,该问题只发生在属于我们客户之一的特定服务器上

应用程序有时会崩溃,核心文件显示非法内存访问。我怀疑原因是malloc函数出现了某种故障。它可能返回空指针,但当这种情况发生时,机器仍然有大量的可用内存。我的理论是,内存太分散了,当它试图分配更多内存(18MB)时,可能失败了

我可以采取哪些步骤来解决此问题?例如,当内存分配失败时,Windows是否记录任何信息?或者它只是忽略了它

有问题的服务器正在运行Windows server 2008 R2,并且Windows事件日志服务正在运行


此时,我不能包含任何代码,因为我不知道应用程序的哪个部分导致了问题。如何缩小范围?

否。Windows偶数日志是您必须在代码中设置和使用的内容,通常用于Windows服务

请显示一段代码片段,演示如何分配内存

通过检查返回的值是否为NULL来检查对malloc的调用的错误应该是一种实践

如果您不确定对malloc的哪个调用失败了,那么最好投资一个好的分析器。我在使用Intel Parallel Studio时取得了很大的成功,但它并不便宜。还要记住,我尝试过的每个分析器都无法在COM边界上工作

“非法内存访问”不一定是分配内存失败。可能是各种各样的事情。您需要将软件分解为可测试单元,并在考虑如何解决问题之前找出问题所在

编辑(问题修订后): 你真的在用“我们不能改变代码”的约束来限制自己

您应该首先在每个文件中搜索malloc或new,并确保检查结果

您还可以选择关闭优化、导出符号、创建生成、安装调试工具以及远程调试,同时逐步查看代码以缩小问题所在。然而,这可能只是一个选项,如果你有一个步骤列表来重现。通常,由于代码中的错误,这些类型的内存问题本质上是随机的。它可能只是在一个构建中出现,而不是在另一个构建中出现,但是bug仍然存在


您也可以远程评测,但评测整个应用程序或服务会产生几乎无法使用的结果。软件应该分解为单元可测试部分,然后再分解为集成可测试部分。如果不是,这就是你付出的代价(即使不是你的错)。

这是一种典型的调试情况。您立即出现故障(非法内存访问),需要找出根本原因。若您正在汇编中调试,您很可能会看到一个寄存器,其中包含一个用于访问内存的无效内存ptr。在识别寄存器之后,您将反向工作以查看该寄存器的值来自何处

如果它从内存分配调用中得到了它的值,那么您的理论可能是正确的

如果它的值来自另一个寄存器或内存位置,而您不知道它的值应该是什么,那么您有一个“中间原因”。第二个寄存器或内存位置是第一个寄存器内存ptr无效的原因

你一直在寻找中间原因,直到找到根本原因——一些被破坏的东西,有人可以修复。为了找到下一个中间原因,您可能需要在调用堆栈上走很长一段路,或者在特定函数中走很长一段路。如果你运气不好,根本原因可能是内存覆盖、竞争条件或其他阻碍了演绎过程的因素

如果您可以进行源代码调试(如果您有第三方应用程序,则可能不会),则可以避免使用汇编语言

顺便说一句,如果你有一个第三方应用程序,很可能你自己无法解决问题,即使你找到了根本原因。您可能需要软件供应商的更新


如果这个软件是开源的,你就有更多的选择。您可以下载源代码、修复错误和重建。或者您可以将修复程序推回到OSS项目中。

没有内存分配失败的日志事件。您甚至不知道
malloc()
一开始是否正在执行操作系统级别的分配,它可能使用私有内部内存池,如果内存池没有足够的内存,则会失败。您是否在调用malloc时测试NULL返回值?“可能返回NULL指针”-您是说您没有检查
malloc()
的结果?另外,它是C还是C++?“它可能返回空指针,但是机器仍然有大量的空闲内存。”为什么不检查代码中的MalOC的返回值并自己执行日志记录?这样,您就可以确定是一个失败的malloc导致了崩溃,并继续调查原因。您说“这不是关于代码错误的问题”,但我相信是的。为了直接回答您的问题,任何Windows都不会记录失败的内存分配,因为进行分配的不是操作系统,而是C标准库。然而,我认为你问这个问题的原因实际上是因为有问题的程序没有正确分配/释放内存。首先确保每次都检查
malloc
/
calloc
/
realloc
的返回值。然后使用一个内存检查工具来找出它的错误所在。OP是供应商,请参阅注释。(我现在重写了问题以包含该信息。)