用GDB调试程序--进程虚拟地址空间和栈布局(菜鸟级)
<!-- [if !mso]> <mce:style><! v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} p\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} v\:textbox {display:none;} --><!-- [endif]--><!-- [if !ppt]--><!-- [endif]-->
一,进程虚拟地址空间
<!-- [if !mso]>
<mce:style><!
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
p\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
v\:textbox {display:none;}
--><!-- [endif]--><!-- [if !ppt]--><!-- [endif]-->

进程的虚拟地址空间分布与源代码的对应关系如下:
栈被破坏的情况下经常导致backstrace结果中当前指令地址异常,可以用来推测堆栈是否被破坏。
通过 /proc/<pid>/maps 文件查看程序运行时文本、数据、堆栈的内存区域映射
正常情况下的代码段地址区间可参考
”
/proc/<PID>/maps
”
文件中属性为
”
r-xp
”
对应项目
/proc
文件目录下,
还有一些其他进程信息,可用以进行进程信息的解读。
如果当前的地址已经不在给该
程序的代码区,也不在链接的库的代码区,则一般是栈被破坏了
。
进程所占用的虚拟地址空间如下所示,操作系统将使用其中的1G。分配给程序的3G中,也有一些必须留作他用。
二,进程的栈空间
如何用GDB查看内存(栈)的内容,请参阅:
http://blog.****.net/IterZebra/archive/2011/02/22/6198875.aspx
用GDB调试程序--调试器GDB常用功能(菜鸟级)
在上述文章中的 "三,调试实例分析 "中,使用了 (gdb) x/24x 0x7fffffffe320打印出从0x7fffffffe320到0x7fffffffe380的内存内容。根据打印结果,分析其中的0x7fffffffe320到0x7fffffffe360,将栈空间的存储情况如下描述: