本地变量的地址不在smaps显示的堆栈地址范围内
Address of local variable not within the address range of stack shown by smaps
我得到了一个进程的堆栈内存信息:
cat /proc/17647/smaps |grep stack
7ffff8840000-7ffff8853000 rwxp 7ffffffe9000 00:00 0 [stack]
我只知道7ffff8840000-7ffff8853000
是VM地址中堆栈段的开始和结束边界,第4列"7ffffffe9000"是第1列中显示的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
附近,因为0x4eb02a40
比7ffffffe9000
小得多,所以0x4eb02a40
是VM地址还是RAM地址?如何获得我的变量的真实RAM地址?
另一个问题是:通过同时使用gdb和pmap或cat/proc/17647/smaps,如何判断变量地址在堆、堆栈或数据段中?
var1是函数中的局部变量(这不会错),但其地址0x4eb02a40既不在VM地址7ffff8840000-7ffff8853000 之间
两种可能的解释。最有可能的一个:
- 您的程序是多线程的,并且您在main之外的线程中遇到了断点
每个线程都有自己的堆栈区域,libpthread.so
从mmap
获得。这样的映射在/proc/self/maps
中没有stack
——就内核而言,这只是一个常规的匿名映射,没有什么特别之处
可能性较小的一个:
- 您的程序使用协程风格的编程(可能使用
makecontext
,也可能使用longjmp
),断点位于在单独堆栈上执行的协程中
相关文章:
- 提升堆栈跟踪不显示函数名称和行号
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 如何使用方法覆盖在输出屏幕上显示堆栈整数值
- 调用堆栈显示 SIGBUS,这意味着什么
- 如何正确显示此堆栈的内容?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 如何在 c++ 中显示(或循环)堆栈
- 哪些更好的方法可以显示使用C STL创建的堆栈而不弹出每个元素的方法
- 堆栈在函数中弹出仍然显示在主函数中。调用不应该通过引用给定的向量吗
- GDB 显示奇怪的堆栈跟踪
- 我如何修改我的C 程序以显示用户输入的单词,并使用堆栈向后
- 模板堆栈类:堆栈中没有显示数据
- 本地变量的地址不在smaps显示的堆栈地址范围内
- 在C++中显示堆栈元素时的无限循环
- Visual Studio 2008 在堆栈溢出后显示完整的堆栈跟踪
- 可视化泄漏检测器(VLD)显示空的调用堆栈
- 堆芯转储的原因是什么?来自oraclelib的堆栈显示
- gdb回溯没有显示main()的完整堆栈跟踪
- 无法显示堆栈或推送
- 如何显示动态堆栈和队列(c++)中的所有元素