【发布时间】:2013-04-16 02:42:48
【问题描述】:
我写了一个sn-p,动态分配时出现内存问题;编译时使用-lefence选项,似乎没有效果。这是代码段:
int main(int argc, char *argv[])
{
int *a = (int *)malloc(2*sizeof(int));
for(int i = 0; i <=2; ++i){
a[i] = i;
printf ("%d\n",a[i]);
}
free(a);
return 0;
}
以及编译选项:
gcc -g3 -Wall -std=c99 outOfBound.c -lefence
预期的结果是,当a.out被执行时,在i被赋值为2并调用a[i]=i之后会有一个核心转储。
那么为什么-lefence没有效果呢?
我还将循环中的上限增加到 9,但仍然没有electric-fence 调用的核心转储。 (实际上默认情况下确实存在核心转储,但这可能是由于MALLOC_CHECK_ env virable,因为当我export MALLOC_CHECK_=0 时,不会再有核心转储了。
更新:nm -A a.out的整体结果如下:
a.out:08049f28 d _DYNAMIC
a.out:08049ff4 d _GLOBAL_OFFSET_TABLE_
a.out:0804864c R _IO_stdin_used
a.out: w _Jv_RegisterClasses
a.out:08049f18 d __CTOR_END__
a.out:08049f14 d __CTOR_LIST__
a.out:08049f20 d __DTOR_END__
a.out:08049f1c d __DTOR_LIST__
a.out:08048718 r __FRAME_END__
a.out:08049f24 d __JCR_END__
a.out:08049f24 d __JCR_LIST__
a.out:0804a01c A __bss_start
a.out:0804a014 D __data_start
a.out:08048600 t __do_global_ctors_aux
a.out:08048480 t __do_global_dtors_aux
a.out:0804a018 d __dso_handle
a.out: w __gmon_start__
a.out:080485f2 t __i686.get_pc_thunk.bx
a.out:00000000 a __init_array_end
a.out:00000000 a __init_array_start
a.out:080485f0 T __libc_csu_fini
a.out:08048580 T __libc_csu_init
a.out: U __libc_start_main
a.out:0804a01c A _edata
a.out:0804a024 A _end
a.out:0804862c T _fini
a.out:08048648 R _fp_hw
a.out:080483b4 T _init
a.out:08048450 T _start
a.out:0804a01c b completed.6159
a.out:0804a014 W data_start
a.out:0804a020 b dtor_idx.6161
a.out:080484e0 t frame_dummy
a.out: U free
a.out:08048504 T main
a.out: U malloc
a.out: U printf
(我在 Ubuntu 12.04 32bit 上使用 debian 包 electric-fence,gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3)
更新(20140801):
对于由 debian(测试分支,即 jessie)打包的 2.2.4 版本的 electric-fence,它可以工作。
【问题讨论】:
-
不确定这是否有帮助,但对我来说它按预期工作(即生成段错误)。但是,我使用来自here 的源代码,使用Makefile 构建它,而且我必须将
-lpthread添加到链接器选项中,否则它不会链接。另外,我在 Fedora 上。 -
@jogojapan 谢谢。确实有可能是deb没有打包好。