gpt4 book ai didi

c++ - 局部变量的地址不在 smaps 显示的堆栈地址范围内

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:58 26 4
gpt4 key购买 nike

我得到了一个进程的堆栈内存信息:

cat /proc/17647/smaps |grep stack

7ffff8840000-7ffff8853000 rwxp 7ffffffe9000 00:00 0 [stack]

我只知道7ffff8840000-7ffff8853000是VM地址中栈段的起止边界,第4列'7ffffffe9000'是图中所示VM地址的RAM起始地址第一栏;映射关系由页表定义。

在这里,我有一个问题:这个 VM 段中的第一个字节是否具有 RAM 地址 7ffffffe9000?在这种情况下,我是否应该使用以下表达式将变量的 VM 地址(例如 x)获取到 RAM 地址:(x - 7ffff8840000)+ 7ffffffe9000

我在这个进程上运行了 gdb 来查看一些局部变量的地址(它只能在堆栈中),

gdb -p 17647
.....
b xx.cpp:100
....
p &var1
$2 = (int *) 0x4eb02a40

这里,我有一个疑问:var1是一个函数中的局部变量(不会错),但是它的地址0x4eb02a40既不在VM地址之间7ffff8840000-7ffff8853000,它也不在附近的 RAM 地址 7ffffffe9000 因为 0x4eb02a407ffffffe9000 小得多,所以 0x4eb02a40 是一个 VM地址还是RAM地址?如何获得我的变量的真实 RAM 地址?

又一个问题:gdb和pmap或者cat/proc/17647/smaps同时使用,如何判断一个变量地址是在堆还是栈还是数据段?

最佳答案

var1 is a local variable in a function (which can not be wrong), but its address 0x4eb02a40 is neither in between VM address 7ffff8840000-7ffff8853000

两种可能的解释。最有可能的一个:

  • 您的程序是多线程的,您在主线程以外的线程中命中断点。

每个线程都有自己的堆栈区域,libpthread.sommap 中获取。这样的映射在/proc/self/maps中没有stack——就内核而言,这只是一个普通的匿名映射,并没有什么特别之处

不太可能:

  • 您的程序使用 coroutine-style编程(可能使用 makecontext,可能使用 longjmp),并且您的断点位于在单独堆栈上执行的协程中。

关于c++ - 局部变量的地址不在 smaps 显示的堆栈地址范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20930102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com