linux - 由于堆大小有限,realloc 函数给出了 SIGABRT
问题描述
我正在尝试重现问题。我的 c 代码给 SIGABRT ,我将其追溯到此行号:3174 https://elixir.bootlin.com/glibc/glibc-2.27/source/malloc/malloc.c
/* Little security check which won't hurt performance: the allocator
never wrapps around at the end of the address space. Therefore
we can exclude some size values which might appear here by
accident or by "design" from some intruder. We need to bypass
this check for dumped fake mmap chunks from the old main arena
because the new malloc may provide additional alignment. */
if ((__builtin_expect ((uintptr_t) oldp > (uintptr_t) -oldsize, 0)
|| __builtin_expect (misaligned_chunk (oldp), 0))
&& !DUMPED_MAIN_ARENA_CHUNK (oldp))
malloc_printerr ("realloc(): invalid pointer");
我的理解是,当我调用 calloc 函数时,当我调用 realloc 函数并尝试增加内存区域时,内存被分配,由于某种原因,堆不可用给 SIGABRT
我的另一个问题是,如何将堆区域限制为一些字节,比如 10 个字节来复制问题。在 stackoverflow 中提到了 RSLIMIT 和 srlimit,但没有提到示例代码。您能否提供堆大小为 10 字节的示例代码?
解决方案
如何将堆区域限制为某些字节,例如 10 个字节
您能否提供堆大小为 10 字节的示例代码?
从How to limit heap size for ac code in linux 中,您可以执行以下操作:
您可以使用(在您的程序中)setrlimit(2),可能与 RLIMIT_AS 一起使用(如 Ouah 的回答所引用)。
#include <sys/resource.h>
int main() {
setrlimit(RLIMIT_AS, &(struct rlimit){10,10});
}
更好的是,让你的外壳来做。对于 bash,它是 ulimit 内置的。
$ ulimit -v 10
$ ./your_program.out
复制问题
最有可能的是,限制堆大小将导致与堆大小限制相关的不同问题。很可能它是不相关的,并且不会帮助您调试问题。相反,我建议研究地址 sanitizer 和 valgrind。
推荐阅读
- sql - 为什么外部查询中同一张表的这个子查询可以作为有效比较
- c - 使用openmp通过openacc使用C在多个GPU上分配矩阵乘法工作
- python - 将上下文管理器与 multiprocessing.Manager 一起使用有什么好处?
- snakemake - snakemake:从数组中写入文件
- swift - 使用 Process 使用 hdiutil 创建 DMG
- javascript - 未捕获的 TypeError:UICtrl.addListItem 不是函数
- r - 观星者舍入错误
- angular - 上传后如何清除表单数据
- javascript - styled-components:扩展样式并更改元素类型
- google-chrome-extension - 即使权限和 HTML 代码有效,为什么在我的扩展中无法复制到剪贴板?