内存问题之找不到地址对应的模块。

先看一个内存问题:

(gdb) bt full
#0  0x080485e1 in main () at test1.c:12
        handle = 0x8bcc018
        p = 0xb7726014
(gdb) p *p
Cannot access memory at address 0xb7726014
(gdb) info proc  mappings 
Mapped address spaces:

	Start Addr   End Addr       Size     Offset objfile
	 0x8048000  0x8049000     0x1000        0x0 /home/charles/tmp/test1
	 0x8049000  0x804a000     0x1000        0x0 /home/charles/tmp/test1
	 0x804a000  0x804b000     0x1000     0x1000 /home/charles/tmp/test1
	0xb7544000 0xb76f4000   0x1b0000        0x0 /lib/i386-linux-gnu/libc-2.23.so
	0xb76f4000 0xb76f5000     0x1000   0x1b0000 /lib/i386-linux-gnu/libc-2.23.so
	0xb76f5000 0xb76f7000     0x2000   0x1b0000 /lib/i386-linux-gnu/libc-2.23.so
	0xb76f7000 0xb76f8000     0x1000   0x1b2000 /lib/i386-linux-gnu/libc-2.23.so
	0xb76fb000 0xb76fe000     0x3000        0x0 /lib/i386-linux-gnu/libdl-2.23.so
	0xb76fe000 0xb76ff000     0x1000     0x2000 /lib/i386-linux-gnu/libdl-2.23.so
	0xb76ff000 0xb7700000     0x1000     0x3000 /lib/i386-linux-gnu/libdl-2.23.so
	0xb772b000 0xb774e000    0x23000        0x0 /lib/i386-linux-gnu/ld-2.23.so
	0xb774e000 0xb774f000     0x1000    0x22000 /lib/i386-linux-gnu/ld-2.23.so
(gdb) 

可以看出,p指向的地址在进程的内存映射里面是找不到的。

一个可能的原因是,p的地址对应的模块已经从 进程里面 unload了,但是其它地方还在使用。

有问题的代码如下:

$ cat 1.c
#include <stdio.h>
int g_a = 200;
void foo(void)
{
	printf("g_a = %d\n", g_a);
}

$ cat test1.c 
#include <dlfcn.h>

#include <stdio.h>

int main(void)
{
	int *handle = dlopen("./lib1.so", RTLD_LAZY);
	int *p = dlsym(handle, "g_a");
	printf("p = %d\n", *p);
	printf("p = %x\n", p);
	dlclose(handle);
	*p =0;
	return 0;
}

gcc 1.c -shared -fpic -g -o lib1.so

gcc test1.c -L. -l1 -ldl -o test1 -g

可以用gdb调试看一下 dlclose前后进程的内存映射就会明白。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值