`

用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.csdn.net/IterZebra/archive/2011/02/22/6198875.aspx

用GDB调试程序--调试器GDB常用功能(菜鸟级)

在上述文章中的 "三,调试实例分析 "中,使用了 (gdb) x/24x 0x7fffffffe320打印出从0x7fffffffe320到0x7fffffffe380的内存内容。根据打印结果,分析其中的0x7fffffffe320到0x7fffffffe360,将栈空间的存储情况如下描述:


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics