我使用malloc
在C程序中分配内存。我的程序可以分配比系统有空间的更多内存,此时程序崩溃。出于我的目的,如果malloc
只返回NULL
(就像它显然是supposed to)那样会更好,所以我可以捕获错误。相反它的作用是抛出一个错误,说“现在没有可用于编程的内存:调用malloc是不安全的”。并且崩溃了程序。
我该如何解决这个问题?
编辑:我知道程序本身崩溃,而不是因为我试图引用空指针。该程序永远不会直接调用malloc
,而是调用我编写的调用malloc
的函数,然后检查它是否返回NULL
。永远不会说malloc
返回NULL
。
编辑2:如果它有用,这里是完整的错误输出:
编程接收信号:“EXC_BAD_ACCESS” sharedlibrary apply-load-rules all 警告:无法恢复先前选择的帧 数据格式化程序暂时不可用,将在“继续”后重试。 (正在调试的程序在从GDB调用的函数中发出信号。
GDB保留在接收信号的帧中 要更改此行为,请使用“set unwindonsignal on”
将放弃对包含函数(dlopen)的表达式的评估。)
现在没有可用于编程的内存:调用malloc不安全
答案 0 :(得分:2)
一旦你通过缓冲区溢出,狂野指针或其他错误在堆上乱涂乱,malloc的行为就变得不明确,它可以返回任何东西。
Malloc只是一个用户空间库;它里面没有任何魔法。如果我在您的应用程序的客户名称链接列表上乱涂乱画,那么当您稍后访问该列表时,您将会遇到奇怪的行为。 Malloc的行为方式相同,但由于malloc的使用是通过代码分发的,因果影响具有全球性。
所有答案都围绕着指针错误是C代码中最常见的缺陷来源这一事实。你很幸运得到一个SIGBUS,这是一个缺陷的证据,可能与故障发生的地方和时间分开。使用valgrind帮助您找到真正缺陷的位置。
答案 1 :(得分:1)
检查Malloc是否返回NULL?您可能在使用相等性测试时遇到问题。尝试类似'if(malloc(...))然后......;别的...;'而不是特定的检查。
如果没有帮助,那么只运行预处理器并找出正在被“编辑”的NULL。
答案 2 :(得分:1)
根据this apple page,如果在xcode中打开MallocErrorAbort
环境变量,程序将根据malloc错误中止。要关闭此变量,请右键单击树视图中的可执行文件,选择“获取信息”,然后转到“参数”选项卡。
答案 3 :(得分:1)
奇怪......如果我从命令行编译它,以下内容适用于我。提供的运行时malloc
确实有a lot of options as Spencer mentioned。如果您正在使用XCode,我会寻找一个控制它的选项。
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int
main()
{
signed long long alloc_sz = (1 * 1024 * 1024 * 1024);
while (alloc_sz > 0ull) {
char *ptr = malloc(alloc_sz);
if (ptr == NULL) {
fprintf(stderr, "failed to allocate %llu bytes\n",
(unsigned long long)alloc_sz);
break;
} else {
free(ptr);
fprintf(stderr, "allocated %llu bytes\n",
(unsigned long long)alloc_sz);
}
alloc_sz *= 2ull;
}
return 0;
}
BTW:是 debug 还是发布版本?可能是XCode试图以某种方式帮助你。
答案 4 :(得分:0)
正如其他人所说,你很可能已经覆盖了malloc's
内部状态,导致它做了奇怪的事情。
在Linux上,你跟踪它的方式是使用valgrind
。如果您的代码足够跨平台,您可以在Linux上运行它(可能在VM中),我建议您这样做。
如果您无法使用此选项,Mac OS X有自己的内置调试工具。在很高的层次上有仪器。在较低级别,malloc
将启用调试以响应某些环境变量:
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/malloc.3.html
向下滚动到ENVIRONMENT
部分。例如,您将使用
MallocGuardEdges=1 ./myProg
你也可以使用libgmalloc
,就像破解时的malloc
调试功能一样。你可以在这里读到它:
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/libgmalloc.3.html
您可以像这样运行您的程序:
DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib ./myProg