sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项
Posted
技术标签:
【中文标题】sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项【英文标题】:sigsegv occured when posix_memalign immediately after free in some devices and compile option in AIX 【发布时间】:2019-07-05 14:51:21 【问题描述】:我被分配了一个指针,它立即空闲,但 sigsegv 取决于某些设备和 xlc 选项。
xlC_r -o cc.o c.c -lhm 发生了 sigsegv,但 xlC_r -o cc.o c.c 有效。
(lhm 选项正在链接 libhm.a libhu.a。) (malloc 和 free 有效。只有 posix_memalign 和 free sigsegv 发生。)
源代码:
#include<stdlib.h>
#include<stdio.h>
int main()
void * sPtr = NULL;
size_t sAlign = 8388608;
size_t sSize = 8388648;
int sRet = 0;
sRet = posix_memalign(&sPtr, sAlign, sSize);
printf( "after malloc : %p return : %d\n", sPtr, sRet );
free(sPtr);
printf( "after free\n" );
return 0;
有效:
aix7.1 tl3 IBM XL C/C++ for AIX,V12.1(5765-J02、5725-C72)版本:12.01.0000.0000 aix6.1 tl9 IBM XL C/C++ for AIX,V10.1 版本:10.01.0000.0008
结果是:
after malloc : 22000000 return : 0
after free
但是
aix6.1 tl3 IBM XL C/C++ for AIX,V10.1 版本:10.01.0000.0008 aix5.3 tl9 IBM XL C/C++ for AIX,V10.1 版本:10.01.0000.0000 aix5.3 tl1 C for AIX 版本 6.0.0.0 版本:10.01.0000.0000
结果是
after malloc : 22000000 return : 0
Segmentation fault (core dumped)
% dbx cc.o core
Type 'help' for help.
[using memory image in core]
reading symbolic information ...
Segmentation fault in _ufree at 0xd3c0fcc4 ($t1)
0xd3c0fcc4 (_ufree+0x44) 80be0000 lwz r5,0x0(r30)
(dbx) where
_ufree(??) at 0xd3c0fcc4
cbase.free(??) at 0xd2b7c048
main(), line 16 in "c.c"
虽然我已经尝试了一个多星期,但我还没有解决这个问题。我从 AIX 搜索了一份错误报告,但找不到。
无法同时删除 posix_memalign 和 lhm 选项。 您知道解决方法或解决方法吗?
【问题讨论】:
%d
不是 size_t
的正确 printf
指令。请改用%zu
。此错误可能会误导您认为分配成功,而实际上并未成功。
不管怎样,我很好奇:如此强烈地对齐分配的对象有什么目的?
看来libhm
.free
无法处理libc
.posix_memalloc
返回的指针。解决方法很简单:删除libhm
在我看来posix_memalign
并没有从内存管理中的同一个领域进行分配。您的代码适用于 musl libc。或许,你可以看一下libhm的文档,看看有什么函数可以释放post_memalign
分配的内存。
能否将对齐方式和大小转换为十六进制? 0x800000
比 8388608
更容易阅读。
【参考方案1】:
libhm 和 libhmd 是调试内存管理库。他们通过在 malloc 之后保留额外信息然后在 free 之前检查该块之前没有被释放并且它是通过 malloc 分配来检测错误。这些库不处理 posix_memalign 并且不为其保留额外信息。因此,当您在 posix_memalign 之后调用 free 时,他们认为您正在尝试释放未正确分配的内存。也就是说,我不记得导致分段错误,而是误报错误消息。 (比起 libhm,我更习惯 libhmd。)
这些库不再维护。例如,请参阅XLF compiler manual page。官方建议改用 AIX 原生的debug malloc tool。
【讨论】:
感谢您的回答。我会找到你提到的文件 似乎 'hmd' 用于调试,'hm' 用于正常使用,但两者都不是标准 AIX 发行版的一部分;它们属于 Fortan 运行时。以上是关于sigsegv 发生在 posix_memalign 在某些设备中释放后立即发生并在 AIX 中编译选项的主要内容,如果未能解决你的问题,请参考以下文章