异常调试——运行时
来源:互联网 发布:淘宝怎么设置7天上下架 编辑:程序博客网 时间:2024/06/16 09:58
程序中一般的问题,可以在debug模式下,设置断点,输入日志等方式排除,
但运行时发生的异常,往往很令人头疼,下面介绍几种运行时排查异常的几种方法:
1.通过map文件确定产生异常的模块和函数
1.1 map文件是什么
map文件是记录PE文件中各个模块及符号的偏移地址和加载地址的文本文件。
1.2 从哪获取map文件
在vs中做如下设置:
property->Configuration Properties->Linker->Debugging 中的Generate Map File选择Yes(/MAP);
同时可以指定生成的map文件名,使用工程名即可,F7重新编译,会在工程目录下产生map文件,用文本工具打开即可查看内容.
1.3 如何使用
在windows中,程序出现异常时,会给出异常偏移地址。
在map文件中,找到第一个比 ‘异常偏移’的地址(Rva+Base),它的上一个地址,就是产生异常的函数和模块.
2.通过cod文件确定异常的发生在源码中具体语句(代码行)
2.1 cod文件是什么
cod文件 记录了源码及其生成的机器码(汇编)等信息
2.1 从哪获取cod文件
property->Configuration Properties->C/C++->output Files中Assembler OutPut中
选择Assembly,Maching Code and Source(/FAcs),生成机器,源代码。
2.3 怎么使用cod文件
前面通过map文件可以确定异常所在的函数&模块,打开与所在模块对应的cod文件,
找到发生异常的函数
‘异常偏移’ - 函数地址 = 异常在函数中的偏移地址,cod文件中左侧的地址
汇编代码上面为c/c++源码
如下:
; 8 : *p=1;//c/c++代码
0001e 8b 45 08 mov eax, DWORD PTR _p$[ebp] //汇编代码
00021 c7 00 01 00 00
00 mov DWORD PTR [eax], 1
3.使用dmp文件做更详细的分析
dmp文件又叫转储文件,记录程序崩溃的一些信息,使用windbg可以进一步分析问题
3.1如何生成dmp文件
3.2使用调试工具
windbg -I 将windbg注册为JIT debugger
然后在WinDbg的命令行中键入 .dump /ma c:\file.dmp 就可以了
3.3 通过代码
使用下面的函数,设置自定义的“未处理的异常过滤”
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
然后在自定义的“未处理的异常过滤”中使用MiniDumpWriteDump记录dmp
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = lpExceptionInfo;
ExInfo.ClientPointers = false;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );
注意备份pdb文件
参考:
http://blog.csdn.net/weikangc/article/details/47839651
http://blog.csdn.net/gwzz1228/article/details/9045853
使用windbg分析dmp文件
http://blog.sina.com.cn/s/blog_a459dcf501017j2v.html
- 异常调试——运行时
- web项目,运行时不抛异常,调试时出现InvocationTargetException
- GDB调试_单步运行时,程序运行步骤异常
- IAR调试QA——单步调试、断点调试、全速运行时数据不一致
- tomcat调试运行(查看异常信息)
- java 异常-运行时异常
- 面向对象—17—运行时异常
- 面试题——常见5种运行时异常
- JAVA多线程——线程运行时异常的处理
- JAVA——运行时异常(RuntimeException)
- 运行时异常与一般异常有何异同? —— Java经典面试题系列
- Java核心技术——异常和调试
- IOS调试技巧——异常断点
- 运行时异常RuntimeException
- 常见运行时异常
- java运行时异常
- 自定义运行时异常
- java运行时异常
- css实现热点地图map,鼠标移到热点弹出层提示框
- 框架搭建
- 一年成为Emacs高手(像神一样使用编辑器)
- Android获取屏幕高度
- ThinkPHP 3.1.2 视图 2
- 异常调试——运行时
- Tomcat 启动修改了start-timeout="1000"还是超时的问题
- Maven详解之仓库------本地仓库、远程仓库、私服
- Java程序员修炼之道 之 Logging(1/3) - Logback 配置
- python 安装request库
- Python的字符串测试
- 关于Android23 及以上模拟器处理应用闪退的一些问题(权限相关)
- XML解析(dom4j)
- docker 1.12 体验