2011-9-27

  烛秋

  昨天、今天调dump,对windbg相当的不熟悉,但也慢慢的知道了一些常用的命令,几周前听说到有gflags这样个工具,今天正好测试下。

  gflags.exe是<Debugging Tools for Windows>中的一个小工具。

  安装下载链接:http://msdn.microsoft.com/en-us/windows/hardware/gg463016

  安装好之后,把gflags所在文件夹(这里边还有很多好东西)设置到环境变量的path中,方便命令行使用。(我的电脑-->右键-->属性-->高级-->环境变量-->系统变量-->path)

  在命令行cmd里输入:cdb -iae 。

  设置cdb为默认JIT(just in time) debugger,这样在命令行执行遇到崩溃的时候就会停下来。

  (本文最后的学习资料相当好)

测试程序:///int main(){char *p = new char[10];for(int i = 0; i != 11; ++i)    p[i] = i;return 0;}///

   这是一个非常简单的越界程序,当i = 10时,访问越界了。但是如果不采用测试工具,这里是不会发生崩溃的。一般情况下,程序获取的空间是16字节对齐的,所以p[10]访问到的是对齐之后增加的空间,不会导致越界崩溃。但这是隐患,为了使隐患尽早被发现,使用工具是很好的选择。
  gflags用来跟踪这个程序的执行,可以设置每一次new分配的堆空间都单独的占有一块空间,并且这个空间相邻的位置被设置为不可访问的,一旦访问越界立即触发访问无效错误,尽早的触发崩溃。

  测试过程如下:

1、用vc编译出release版本的可执行文件:test.exe。(注意:不是debug版本)

2、用gflag注册需要监控的可执行文件test.exe。

在cmd下,输入命令如下:gflags /p /enable test.exe /full /unaligned。

回车,显示如下信息:

*************************************************************************************

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

  test.exe: page heap enabled。

*************************************************************************************

这个时候,已经把要监控的test.exe注册上了。

/p /enable是必备的。

/full说明分配的空间是独占的,并且相邻的是不可访问的空间。

/unaligned说明分配空间时不对齐,保证一旦越界立即发现,不会因为内存对齐而隐藏起来。

3、接着双击执行test.exe,这个时候,会中断下来:

*************************************************************************************

(17f8.5d0): Access violation - code c0000005 (!!! second chance !!!)

eax=0161eff6 ebx=7c80ac61 ecx=0000000a edx=015c5000 esi=00000002 edi=00000a28

eip=00401010 esp=0012ff74 ebp=0012ffc0 iopl=0         nv up ei ng nz ac pe cy

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000297

WindbgTest!main+0x10:

00401010 880c01          mov     byte ptr [ecx+eax],cl      ds:0023:0161f000=??

*************************************************************************************

如果把exe放到windbg里执行,用命令:!address,可以发现eax是可以读写的,

eax+ecx是不可访问的:

*************************************************************************************

0:000> !address eax

015c0000 : 0161e000 - 00001000

    Type     00020000 MEM_PRIVATE

    Protect  00000004 PAGE_READWRITE

    State    00001000 MEM_COMMIT

    Usage    RegionUsagePageHeap

    Handle   015c1000

0:000> !address eax+ecx

015c0000 : 0161f000 - 000a1000

    Type     00020000 MEM_PRIVATE

    Protect  00000001 PAGE_NOACCESS

    State    00001000 MEM_COMMIT

    Usage    RegionUsagePageHeap

    Handle   015c1000

*************************************************************************************

4、取消跟踪:

通过/p命令可以看到当前跟踪的程序有哪些:

*************************************************************************************

C:\Documents and Settings\cs_wuyg>gflags /p

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

    player.exe: page heap enabled with flags (full traces )

    program: page heap enabled with flags (full unaligned traces )

    test.exe: page heap enabled with flags (full unaligned traces )

    windbgtest.exe: page heap enabled with flags (full unaligned traces )

*************************************************************************************

通过/p /disble取消跟踪:情况如下:

*************************************************************************************

C:\Documents and Settings\cs_wuyg>gflags /p /disable player.exe

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

    player.exe: page heap disabled

C:\Documents and Settings\cs_wuyg>gflags /p

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

    program: page heap enabled with flags (full unaligned traces )

    test.exe: page heap enabled with flags (full unaligned traces )

    windbgtest.exe: page heap enabled with flags (full unaligned traces )

*************************************************************************************

发现program是无法取消的,很奇怪。另外,发现注册表里相应的项目在disable之后,仍然存在,只不过一些键值被删除掉了。

同事跟我说,不使用gflags的时候,最好把注册表里的项目删除,gflags对机器性能的影响很大。

注册表的位置是:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/Image File Execution Options

5、注意事项

一、gflags要跟踪的程序,是把这个程序的名称记录到了注册表中,在设置的时候不需要可执行文件的路径名,只需要文件名称。

二、可以使用命令行,也可以使用GUI界面。GUI界面中的前两个TAB页面是对所有的可执行程序都有效的。第三个才是设置想要跟踪的程序。

三、还有其它更强大的工具。

6、总结

通过这个工具的简单使用,就可以很快发现代码中有访问越界。

在大工程下,是否也非常有用,现在还没实践过。

使用gflags,并且在VS下调试,有源代码更方便。

7、附今天用上的几个windbg命令:

1\ !analyze -v

2\ kv   kf    kb

3\ ~*k

4\ .ecxr

5\ lmvm xxx.exe

分析dump的时候,看调用堆栈是从下往上看的。

调用堆栈前部分的数值一部分是参数,一部分是无用的信息。

设置好source file path之后,.ecxr命令可以看到当前的寄存器信息,还可以看到源代码。

发现很多的崩溃是由于空指针、野指针导致的。而空指针、野指针是由于多线程导致卸载、装载重叠导致的。

学习资料:

http://www.cppblog.com/sandy/archive/2007/03/13/19723.html

http://blog.csdn.net/ayw_hehe/article/details/6796333

http://www.cppblog.com/sandy/archive/2008/09/27/62877.html

http://www.cnblogs.com/awpatp/archive/2011/01/01/1923913.html

http://blog.sina.com.cn/s/blog_484f16880100jrwj.html

gflags调试访问越界相关推荐

  1. GFlags调试堆中野指针

    我个人觉得写代码最悲哀的就是,程序的出错结果往往出人意料,并不在自己预期的错误列表中,其中堆中的野指针就是一个很隐蔽的问题.记得之前写了一个模块,后来因为功能升级,而修改了部分接口,等到运行的时候,老 ...

  2. 小程序真机调试访问不了接口_小程序入门

    之前写了一个去水印的小程序,详情可查看「短视频去水印工具小程序版-去水印Pro版」一文,我个人对小程序也是从完全陌生到入门阶段,这篇文章就把入门的过程和遇到的问题记录一下. 一.小程序注册 想要开发小 ...

  3. Django不能ip调试访问

    Django不能ip访问 解决方法: 命令python manage.py runserver默认监听127.0.0.1:8000 但是地址127.0.0.1是一个回环地址,表示"我自己&q ...

  4. 小程序真机调试访问不了接口_24小时从0到1开发阴阳师小程序

    作者:rapospectre来源:https://www.rapospectre.com/blog/create-an-onmyoji-weapp-in-24-hours 玩阴阳师的肝帝们都知道,每天 ...

  5. 微信小程序体验版,手机打开调试正常访问 关闭调试访问不通

    最近,我们几个伙计组队准备参加微信小程序大赛,小程序内测版写好了,上线体验版时,却出现了一堆问题.最离谱的是,将代码上传到微信公众平台后,用手机扫码访问时,发现只要涉及到向后端发送请求的按钮都无法执行 ...

  6. stm32调试内存越界情况

    最近项目调试中总是遇到内存越界,现象比较诡异.再此写下记录,以便后续学习. 现象:测试整个流程 莫名其妙的 重启,有的时候不重启但是进入死循环.单步跟踪 有时不在同一个地方进入异常. 调试过程: 测试 ...

  7. gflags 调试内存_gflags工具使用——用于监控内存分配、检查内存泄露

    想要知道程序从开始到运行一段时间内存的使用情况,可以使用gflags工具. 1. windbg同级目录下有gflags.exe,点开后进行如下设置. 2. 在gflags.exe的目录下直接打开命令窗 ...

  8. 小程序 体验版 打开调试正常 关闭调试访问不通

    如题 小程序 体验版 打开调试模式正常 关闭调试模式则访问不了 检查你的域名.证书: 去掉不校验域名证书选项 看下是否报错 添加域名 ok通过

  9. Tricks(四十九)—— 按 batch 访问越界的解决办法

    使用 min 函数指定访问的最终位置,本质上是增加一个条件判断: done = false; batch_size = 10000;idx = 1; while ~doneidx_end = min( ...

最新文章

  1. nagios npc安装后状态为off的解决方法
  2. CCNA培训课总结笔记--交换机的基本配置(十三)
  3. iOS 13 Xcode11 中的 Scene Delegate
  4. 解析:一种合适的数据中心建造方式有多重要?
  5. julia(6)-循环与猜数字
  6. Java集合框架总结(5)——Map接口的使用
  7. win7 没有microsoft print to pdf_现在还能不能下载到正版WIN 7
  8. 【Pix4d精品教程】大疆精灵4A无人机航空摄影测量外业数据采集完整操作流程
  9. P4592 [TJOI2018]异或
  10. [html] H5如何与APP交互?有哪些方式?
  11. 使用 jQuery Mobile 与 HTML5 开发 Web App (五) —— jQuery Mobile 表单下
  12. es基于completion suggest实现搜索提示
  13. android 应用开发(第70章)---二维码
  14. Cordova+Vue快速搭建Hybrid App
  15. 减少工作时间更有利于百姓
  16. CSDN博客积分规则
  17. Misra-Gries 算法
  18. TeraTerm SSH 登陆
  19. c语言 二维数组指针
  20. 信息系统管理工程师记忆口诀

热门文章

  1. docker redis重启_Docker解决傻瓜式安装软件
  2. 物资管理系统 c语言,物资管理系统课程设计报告.doc
  3. 采用CreateThread()创建多线程程序
  4. python验证码_Python验证码登录(Tesseract安装配置)
  5. 用电梯服务器怎样解电梯显示E34,默纳克品牌电梯故障代码e41怎么处理
  6. java 监控usb端口插拔_如何监控某种类型的USB设备的插拔?
  7. 英语语法---不定式短语详解
  8. 数据结构与算法(C++)– 栈(Stack)
  9. Java基础day21
  10. 【深度学习】这千层transformer让我目瞪口呆