Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Crash 如何解决malloc中的崩溃问题_Crash_Malloc - Fatal编程技术网

Crash 如何解决malloc中的崩溃问题

Crash 如何解决malloc中的崩溃问题,crash,malloc,Crash,Malloc,我继承了大量的遗留代码。到目前为止,它一直运作良好。突然,在一次我无法在内部复制的客户试用中,它在malloc崩溃了。我认为我需要添加插装,例如在malloc之上我有自己的malloc,它存储关于每个malloc的一些元信息,例如谁进行了malloc调用。当它崩溃时,我可以查找元信息并查看发生了什么。我几年前也做过类似的事情,但现在想不起来了……我相信人们已经想出了更好的主意。我会很高兴有意见的 谢谢内存分配是否中断? 试试看 马洛克还在崩溃。 好吧,我得假设你的意思是SIGSEGV分段故障在m

我继承了大量的遗留代码。到目前为止,它一直运作良好。突然,在一次我无法在内部复制的客户试用中,它在malloc崩溃了。我认为我需要添加插装,例如在malloc之上我有自己的malloc,它存储关于每个malloc的一些元信息,例如谁进行了malloc调用。当它崩溃时,我可以查找元信息并查看发生了什么。我几年前也做过类似的事情,但现在想不起来了……我相信人们已经想出了更好的主意。我会很高兴有意见的

谢谢

内存分配是否中断? 试试看

马洛克还在崩溃。 好吧,我得假设你的意思是SIGSEGV分段故障在malloc中触发。这通常是由堆损坏引起的。堆损坏本身不会导致分段错误,通常是数组访问超出数组边界的结果。这通常离你称之为malloc的点很远

malloc在返回给您的内存块前面存储一个小的信息头。此信息通常包含块的大小和指向下一个块的指针。不用说,改变其中任何一个都会带来问题。通常,下一个块指针更改为无效地址,下次调用malloc时,它最终会取消对坏指针和分段错误的引用。或者它不这样做,并开始将随机内存解释为堆的一部分。最终,它的运气耗尽了

请注意,如果释放的块或空闲块列表混乱,空闲块也会发生同样的情况

如何捕获此类错误完全取决于如何访问malloc返回的内存。单个结构的malloc通常不是问题;通常是数组的malloc让您。使用负-1或-2索引通常会给出当前块的块头,而通过数组结尾进行索引可以给出下一个块的块头。两者都是有效的内存位置,因此不会出现分段错误

因此,首先要尝试的是范围检查。您提到这出现在客户的网站上;可能是因为他们使用的数据集大得多,或者输入数据已损坏,例如,它表示分配100个元素,然后初始化101个元素,或者他们以不同的顺序执行操作,从而在内部测试中隐藏错误,或者执行一些您未测试的操作。没有更多的细节很难说。你应该考虑写一些东西来检查你的输入数据。

内存分配是否坏了? 试试看

马洛克还在崩溃。 好吧,我得假设你的意思是SIGSEGV分段故障在malloc中触发。这通常是由堆损坏引起的。堆损坏本身不会导致分段错误,通常是数组访问超出数组边界的结果。这通常离你称之为malloc的点很远

malloc在返回给您的内存块前面存储一个小的信息头。此信息通常包含块的大小和指向下一个块的指针。不用说,改变其中任何一个都会带来问题。通常,下一个块指针更改为无效地址,下次调用malloc时,它最终会取消对坏指针和分段错误的引用。或者它不这样做,并开始将随机内存解释为堆的一部分。最终,它的运气耗尽了

请注意,如果释放的块或空闲块列表混乱,空闲块也会发生同样的情况

如何捕获此类错误完全取决于如何访问malloc返回的内存。单个结构的malloc通常不是问题;通常是数组的malloc让您。使用负-1或-2索引通常会给出当前块的块头,而通过数组结尾进行索引可以给出下一个块的块头。两者都是有效的内存位置,因此不会出现分段错误

因此,首先要尝试的是范围检查。您提到这出现在客户的网站上;可能是因为他们使用的数据集大得多,或者输入数据已损坏,例如,它表示分配100个元素,然后初始化101个元素,或者他们以不同的顺序执行操作,从而在内部测试中隐藏错误,或者执行一些您未测试的操作。没有更多的细节很难说。你应该考虑写一些东西来理智地检查你的输入数据。

< P>试试Asan

AddressSanitizer又名ASan是C/C++的内存错误检测器。它发现:

Use after free (dangling pointer dereference)
Heap buffer overflow
Stack buffer overflow
Global buffer overflow
Use after return
Use after scope
Initialization order bugs
Memory leaks
请查找链接以了解更多信息以及如何使用它

及 尽快尝试

AddressSanitizer又名ASan是C/C++的内存错误检测器。它发现:

Use after free (dangling pointer dereference)
Heap buffer overflow
Stack buffer overflow
Global buffer overflow
Use after return
Use after scope
Initialization order bugs
Memory leaks
请查找链接以了解更多信息 如何使用它


我知道这已经过时了,但只要我们有指针,这样的问题就会继续存在。尽管valgrind是实现这一目的的最佳工具,但它有一个陡峭的学习曲线,而且结果往往过于吓人而难以理解

假设您正在处理一些*nux,我可以推荐的另一个工具是。引述:

Electric Fence可帮助您检测两个常见的编程错误:

software that overruns the boundaries of a malloc() memory allocation,
software that touches a memory allocation that has been released by free().
Unlike other malloc() debuggers, Electric Fence will detect read accesses
as well as writes, and it will pinpoint the exact instruction that causes
an error.
用法非常简单。只需将代码与附加库链接即可
运行应用程序时,当内存损坏时,而不是使用损坏的内存时,将生成一个corefile。

我知道这是旧的,但只要我们有指针,这样的问题就会继续存在。尽管valgrind是实现这一目的的最佳工具,但它有一个陡峭的学习曲线,而且结果往往过于吓人而难以理解

假设您正在处理一些*nux,我可以推荐的另一个工具是。引述:

Electric Fence可帮助您检测两个常见的编程错误:

software that overruns the boundaries of a malloc() memory allocation,
software that touches a memory allocation that has been released by free().
Unlike other malloc() debuggers, Electric Fence will detect read accesses
as well as writes, and it will pinpoint the exact instruction that causes
an error.
用法非常简单。只需将代码与附加库链接即可
运行应用程序时,当内存损坏时,而不是使用损坏的内存时,将生成一个corefile。

谢谢。valgrind没有捕获我们看到的错误。还有其他输入吗?谢谢。valgrind没有捕捉到我们看到的错误。还有其他输入吗?有人破坏了记忆,这是“罪魁祸首”。坠机现场只显示了“受害者”。除了使用专用工具valgrind等,您还可以尝试以下方法:检查坠机现场周围的内存,前提是您拥有核心文件和符号。使用gdb,用x/a检查内存有人正在破坏内存“罪魁祸首”。坠机现场只显示了“受害者”。除了使用专用工具valgrind等,您还可以尝试以下方法:检查坠机现场周围的内存,前提是您拥有核心文件和符号。使用gdb,用x/a检查内存