• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            一動(dòng)不如一靜

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              20 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks

            有時(shí)候我們的程序crash了,會(huì)出現(xiàn)一個(gè)crash界面提示我們?cè)谑裁次恢弥袛嗔恕N覀內(nèi)绾胃鶕?jù)這個(gè)中斷地址找到對(duì)應(yīng)的行號(hào)呢?

            要想達(dá)到這樣的目的,首先要進(jìn)行一些工程屬性的配置。

            c/c++->常規(guī)->調(diào)試信息格式->程序數(shù)據(jù)庫(kù)
            c/c++->優(yōu)化->優(yōu)化->禁用
            鏈接器->調(diào)試->生成調(diào)試信息->是
                        ->生成映射文件->是
                        ->映射文件名稱(chēng)->$(OutDir)/$(ProjectName).map
                        ->映射導(dǎo)出->是
                        ->映射行->是

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

            當(dāng)執(zhí)行程序的時(shí)候,顯示“test1.exe中的0x0040100e處未處理的異常:0xc000005:寫(xiě)入位置0x00000000時(shí)發(fā)生訪問(wèn)沖突”


            這個(gè)時(shí)候來(lái)看一下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地址計(jì)算:calculation: crash_address - preferred_load_address - 0x1000
                                        0x0040100e -0x00400000-0x1000=0x0000000e

            接著在map中查找對(duì)應(yīng)的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


            最后根據(jù)obj和計(jì)算的值在map中找第一個(gè)小于我們所計(jì)算的值的位置

            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中查找第一個(gè)小于我們所計(jì)算的值的位置

            所以我們的中斷位置是在第4行

            posted on 2007-05-03 10:44 一動(dòng)不如一靜 閱讀(1569) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): C++

            Feedback

            # re: 如何根據(jù)crash地址找到對(duì)應(yīng)的行號(hào) 2007-08-14 12:45 夢(mèng)在天涯
            這個(gè)還是有點(diǎn)專(zhuān)業(yè)哦,能不能來(lái)一個(gè)再詳細(xì)點(diǎn)的哦,方首頁(yè)讓大家一起學(xué)習(xí)了!  回復(fù)  更多評(píng)論
              

            # re: 如何根據(jù)crash地址找到對(duì)應(yīng)的行號(hào) 2008-01-21 10:20 mikey
            你這個(gè)辦法不太好用啊,比如在程序里面用了個(gè)strcpy出錯(cuò)了,出錯(cuò)的地址
            最后就映射到strcpy.asm里面去了,怎么知道是在主程序的什么地方調(diào)用了
            strcpy阿  回復(fù)  更多評(píng)論
              

            # re: 如何根據(jù)crash地址找到對(duì)應(yīng)的行號(hào) 2010-08-19 10:04 等等
            查看堆棧不就完了。。。  回復(fù)  更多評(píng)論
              

            久久人人爽人人澡人人高潮AV| 情人伊人久久综合亚洲| 国内精品久久久久久麻豆| 久久e热在这里只有国产中文精品99| 亚洲一区二区三区日本久久九| 久久天天婷婷五月俺也去| 久久夜色精品国产噜噜麻豆| 99久久精品国产麻豆| 色偷偷88欧美精品久久久 | 欧美午夜A∨大片久久 | 久久国产三级无码一区二区| 综合网日日天干夜夜久久| 韩国三级中文字幕hd久久精品 | 久久人人爽人人爽人人片AV东京热 | 久久亚洲国产欧洲精品一| 久久综合五月丁香久久激情| 国产精品久久久亚洲| 色婷婷综合久久久久中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 日韩va亚洲va欧美va久久| 久久精品国产亚洲沈樵| 精品久久久久久综合日本| 伊人久久大香线蕉av一区| 亚洲欧洲久久av| 日韩人妻无码一区二区三区久久99| 国产精品99久久不卡| 激情综合色综合久久综合| 国产一久久香蕉国产线看观看| 久久亚洲精品中文字幕| 久久无码国产专区精品| 亚洲国产成人久久一区久久| 久久人搡人人玩人妻精品首页| 九九久久精品无码专区| 久久综合久久性久99毛片| 欧美性猛交xxxx免费看久久久| 久久久久国产精品麻豆AR影院 | 免费国产99久久久香蕉| 国产一久久香蕉国产线看观看| 国内精品人妻无码久久久影院| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 亚洲日韩中文无码久久|