4.查看调用栈
k命令:显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256。
我们如何来判断函数的栈指针,参数地址和局部变量地址呢? 举一个简单的windbg的kv命令输出:
ChildEBP RetAddr Args to Child
03b1f9c4 0032549e 00e1b5f0 00e259f8 7c900059
如上所示,ebp是栈的指针,其中ebp+4保存的是函数返回地址,因此ebp+8(00e1b5f0 )开始就是函数的参数. 结合上面的栈地址图,由于栈是从高到低压栈,所以不可能往高位扩展(那样会破坏上层堆栈),因此局部变量只能是向低位扩展,所以通常ebp-4就是低一个局部变量地址. 由于是在往低位扩展,所以当局部变量过多或者函数层数过多时,会出现堆栈溢出.
堆栈溢出
首先说下windows默认的堆栈大小,在用户层一个线程默认堆栈大小是1M,程序可以设置. 驱动中默认是13K左右,具体记不清了.那么如何判断堆栈溢出呢? windbg有一个非常有用的命令kf -n ,其中n是要显示的frame数.
注释:堆栈桢基址,函数返回地址,第一个参数,第二个参数
kp 5
显示调用栈中前5个函数以及他们的参数.
kb 5
显示调用栈中前五个函数以及他们的前三个参数.
kf 5
显示在调用栈中五个函数所使用的栈的大小.
每个栈帧所占的空间使用量的计算方法是: 将当前函数的栈基指针与在函数中调用的任何一个函数栈基指针相减.
举例:
手动构造栈的实践- 如何手工构造调用栈
栈基本概念
首先说一下栈的结构,栈是从高地址开始压栈的. 如下图,函数中存在函数调用,首先是Frame1压栈,然后是Frame2压栈.其调用关系是Frame1调用Frame2. 对于参数的压栈windows默认的stdcall,cdell都是从右边参数开始压栈.而delph所试用的passcall是从左开始压栈. 因此,加入存在一个函数fun(int p1, int p2);
首先用几幅图说明一下栈的特点, 帮助大家理解.
1. 栈向低地址增长.
2. 向栈中压入数据, 栈中的情况如图.
3. 有函数调用的栈中的情况.
注意, 手工构造栈的时候, 我们需要利用的是上面图中显示的一个模式:
在内存中的一系列的值是可以被识别出来的, 这些值表示当前站中的某个地址, 并且在这些值之后是一个可执行的地址.
windbg命令学习4的更多相关文章
-
windbg命令学习3
3.进程与线程: 既可以显示进程和线程列表,又可以显示指定进程或线程的详细信息.调试命令可以提供比taskmgr更详尽的进程资料,在调试过程中不可或缺. 3.1. 进程命令 进程命令包括以下:显示进程 ...
-
windbg命令学习2
一.windbg查看内存命令: 当我们在调试器中分析问题时, 经常需要查看不同内存块的内容以分析产生的原因, 并且在随后验证所做出的假设是否正确. 由于各个对象的状态都是保存在内存中的, 因此内存的内 ...
-
windbg命令学习1
一.windbg 常用知识: 1. Windbg中的调试命令,分为三种:基本命令,元命令和扩展命令.基本命令和元命令是调试器自带的,元命令总是以“.”开头,而扩展命令是外部加入的,总是以感叹号“!”开 ...
-
Windbg命令学习15(bp bm bu bl bc ba断点)
以下以skinhgy为例,windbg附加运行 1. bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会 ...
-
Windbg命令脚本
命令脚本,就是将完成某个特定任务的相关命令组合在一起,保存在脚本文件里,加载到Windbg里执行,达到我们的目的.你可以理解为脚本就是一种语言,就像c或者汇编,但是他不需要编译器将其编译为可执行文件, ...
-
别出心裁的Linux命令学习法
别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...
-
Git版本控制软件结合GitHub从入门到精通常用命令学习手册(转)
简要参考:http://www.tuicool.com/articles/mEvaq2 http://gitref.org/zh/index.html GIT 学习手册简介 本站为 Git 学习参考手 ...
-
penghui_031413 Bat命令学习
penghui_031413 Bat命令学习 基础部分:====================================================================== ...
-
WinDbg 命令三部曲:(一)WinDbg 命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
随机推荐
-
SSH框架整合(代码加文字解释)
一.创建数据库并设置编码. A) create database oa default character set utf8. 二.MyEclipse工程 A) 在Myeclipse里创建web工程, ...
-
利用varnish做Discuz论坛的缓存服务器
实验背景:公司有一台BBS服务器,用的是LNMP的架构搭建的.正好手头有一台空闲的虚拟机,于是想着给BBS前端加一台缓存服务器.于是选定了varnish,搜了很多教程,跌跌撞撞的完成了配置.这其中很多 ...
-
java对xml文件的读取
<?xml version="1.0" encoding="UTF-8"?> <body> <names type="1 ...
-
安卓:drawable
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
-
【转】 简单理解Socket
题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...
-
ccw-ide
有bug,会把working set弄乱,整理后能重启一次正常,再次重启又乱了.
-
微信JS分享功能--微信JS系列文章(二)
概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...
-
Hybris商品图片导入与压缩有关的配置
1. 在电脑上安装 ImageMagick 软件(windows平台还需要安装VC++),下载路径:http://www.imagemagick.org/script/download.php#w ...
-
Java基础之数据比较Integer、Short、int、short
基础很重要,基础很重要,基础很重要.重要的事情说三遍,. 今天聊一聊Java的数据比较,这个范围比较大,基础类型的比较.引用类型的比较. 前提: 1.Java和c#都提供自动装箱和自动拆箱操作,何为自 ...
-
docker存储与网络
目录 Docker存储 挂载主机目录 创建一个数据卷 挂载一个宿主机目录作为数据卷 数据卷容器 创建一个数据卷容器 利用数据卷容器迁移数据 删除数据盘 Docker网络 简介 bridge网络 bri ...