一动不如一静

C++博客 首页 新随笔 联系 聚合 管理
  20 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks

有时候我们的程序crash了,会出现一个crash界面提示我们在什么位置中断了。我们如何根据这个中断地址找到对应的行号呢?

要想达到这样的目的,首先要进行一些工程属性的配置。

c/c++->常规->调试信息格式->程序数据库
c/c++->优化->优化->禁用
链接器->调试->生成调试信息->是
            ->生成映射文件->是
            ->映射文件名称->$(OutDir)/$(ProjectName).map
            ->映射导出->是
            ->映射行->是

1    int main (int argc, char* argv[])
2   {
3       char * p = 0;
4       *p = 'c';
5       return 0;
6 }

当执行程序的时候,显示“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行

posted on 2007-05-03 10:44 一动不如一静 阅读(1516) 评论(3)  编辑 收藏 引用 所属分类: C++

Feedback

# re: 如何根据crash地址找到对应的行号 2007-08-14 12:45 梦在天涯
这个还是有点专业哦,能不能来一个再详细点的哦,方首页让大家一起学习了!  回复  更多评论
  

# re: 如何根据crash地址找到对应的行号 2008-01-21 10:20 mikey
你这个办法不太好用啊,比如在程序里面用了个strcpy出错了,出错的地址
最后就映射到strcpy.asm里面去了,怎么知道是在主程序的什么地方调用了
strcpy阿  回复  更多评论
  

# re: 如何根据crash地址找到对应的行号 2010-08-19 10:04 等等
查看堆栈不就完了。。。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理