如何根据 crash 地址找到对应的行号
来源:互联网 发布:php中filegetcontents 编辑:程序博客网 时间:2024/04/28 23:39
有时候我们的程序crash了,会出现一个crash界面提示我们在什么位置中断了。我们如何根据这个中断地址找到对应的行号呢?
要想达到这样的目的,首先要进行一些工程属性的配置。
c/c++->常规->调试信息格式->程序数据库
c/c++->优化->优化->禁用
链接器->调试->生成调试信息->是
int main (int argc, char* argv[]){ char * p = 0; *p = 'c'; return 0;}
当执行程序的时候,显示“test1.exe中的0x0040100e处未处理的异常:0xc000005:写入位置0x00000000时发生访问冲突”
这个时候来看一下map文件。首先看到的是参考的加载地址: Preferred load address is 00400000
Timestamp is 4639462c (Thu May 03 10:17:16 2007) Preferred load address is 00400000 Start Length Name Class 0001:00000000 00003b58H .text CODE 0002:00000000 000000c4H .idata$5 DATA 0002:000000d0 00000c40H .rdata DATA 0002:00000d10 00000048H .rdata$debug DATA 0002:00000d60 00000008H .rdata$sxdata DATA 0002:00000d68 00000004H .rtc$IAA DATA 0002:00000d6c 00000004H .rtc$IZZ DATA 0002:00000d70 00000004H .rtc$TAA DATA 0002:00000d74 00000004H .rtc$TZZ DATA 0002:00000d78 00000014H .idata$2 DATA 0002:00000d8c 00000014H .idata$3 DATA 0002:00000da0 000000c4H .idata$4 DATA 0002:00000e64 00000366H .idata$6 DATA 0002:000011ca 00000000H .edata DATA 0003:00000000 00000004H .CRT$XCA DATA 0003:00000004 00000004H .CRT$XCAA DATA 0003:00000008 00000004H .CRT$XCZ DATA 0003:0000000c 00000004H .CRT$XIA DATA 0003:00000010 00000008H .CRT$XIC DATA 0003:00000018 00000004H .CRT$XIZ DATA 0003:0000001c 00000004H .CRT$XPA DATA 0003:00000020 00000004H .CRT$XPZ DATA 0003:00000024 00000004H .CRT$XTA DATA 0003:00000028 00000004H .CRT$XTZ DATA 0003:00000030 00000274H .data DATA 0003:000002c0 00000598H .bss DATA
crash地址计算:
calculation: crash_address - preferred_load_address - 0x1000
0x0040100e -0x00400000-0x1000=0x0000000e
接着在map中查找对应的obj
Address Publics by Value Rva+Base Lib:Object 0000:00000000 __except_list 00000000 <absolute> 0000:00000002 ___safe_se_handler_count 00000002 <absolute> 0001:00000000 _main 00401000 f test1.obj 0001:00000017 __amsg_exit 00401017 f LIBC:crt0.obj 0001:0000003c _mainCRTStartup 0040103c f LIBC:crt0.obj 0001:00000203 ___crtExitProcess 00401203 f LIBC:crt0dat.obj
最后根据obj和计算的值在map中找第一个小于我们所计算的值的位置
Line numbers for ./release/test1.obj(d:/test/test1/test1/test1.cpp) segment .text 2 0001:00000000 3 0001:00000004 4 0001:0000000b 5 0001:00000011
然后在.map中查找第一个小于我们所计算的值的位置
所以我们的中断位置是在第4行
注:本文转载自:http://blog.sina.com.cn/s/blog_4ae178ba0100w3sa.html
- 如何根据 crash 地址找到对应的行号
- 如何根据Kernel Oops中的地址找到对应的代码行
- 根据IP地址,找到交换机上相对应的端口
- DB2中如何根据锁名找到对应的行
- 根据对应的报错位置的地址找到对应的代码段
- 根据core找到对应的程序
- 【HDFS】namenode如何根据输入的文件(路径)名找到对应的inode的?
- 使用AbstractProcessor如何根据类的注解,找到对应类的字段
- 如何根据Android 运行时的进程名找到对应APK包路径
- 如何根据Android 运行时的进程名找到对应APK包路径
- oracle 根据事务号 xid 如何找到对应的那个语句
- 【FAQ】如何根据commit id找到对应节点所属的分支和标签?
- 根据外键名称找到对应的表
- syfomy自动根据url中的id找到对应的记录
- Liferay中根据Portlet找到对应的JSP页面
- iOS 根据某个value找到Dictionary对应的key值
- 遍历数组对象,根据已知信息找到对应的对象
- 如何快速找到对应版本的JDK
- 落榜不落志近三年16位高考复读生状元盘点
- 福建普通高考本科批志愿28日起填报
- 高考志愿填报:独立学院遇冷民办本科趋热
- VS2005 Addin续--编写C#代码统计插件
- Apache 日志的配置
- 如何根据 crash 地址找到对应的行号
- 三种遍历树的方法
- 简洁的优势
- Vista没有了XP中方便的“运行方式”
- javascript 选择路径自动显示图片
- IBM 大型机培训课程分析
- malloc/free和new/delete用法浅析
- Mix-in技术介绍
- C++指针|指针入门