﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-云竹居-文章分类-VC++6.0</title><link>http://www.cppblog.com/baoyz/category/12509.html</link><description>云竹</description><language>zh-cn</language><lastBuildDate>Sun, 14 Feb 2010 03:37:36 GMT</lastBuildDate><pubDate>Sun, 14 Feb 2010 03:37:36 GMT</pubDate><ttl>60</ttl><item><title>如何通过崩溃地址找到出错的代码行</title><link>http://www.cppblog.com/baoyz/articles/107472.html</link><dc:creator>云竹</dc:creator><author>云竹</author><pubDate>Mon, 08 Feb 2010 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/baoyz/articles/107472.html</guid><wfw:comment>http://www.cppblog.com/baoyz/comments/107472.html</wfw:comment><comments>http://www.cppblog.com/baoyz/articles/107472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/baoyz/comments/commentRss/107472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/baoyz/services/trackbacks/107472.html</trackback:ping><description><![CDATA[<p>这是从&#8220;VC编程经验总结7&#8221;中转出来的 </p>
<p>好吧，既然 MAP 文件如此神奇，那么我们应该如何生成它呢？在 VC 中，我们可以按下 Alt+F7 ，打开&#8220;Project Settings&#8221;选项页，选择 C/C++ 选项卡，并在最下面的 Project Options 里面输入：/Zd ，然后要选择 Link 选项卡，在最下面的 Project Options 里面输入： <br>/mapinfo:lines /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件。 </p>
<p>在 MASM 中，我们要设置编译和连接参数，我通常是这样做的： </p>
<p>rc %1.rc <br>ml /c /coff /Zd %1.asm <br>link /subsystem:windows /mapinfo:exports /mapinfo:lines /map:%1.map %1.obj %1.res </p>
<p>把它保存成 makem.bat ，就可以在命令行输入 makem filename 来编译生成 EXE 可执行文件和 MAP 文件了。 </p>
<p>在此我先解释一下加入的参数的含义： </p>
<p>/Zd 表示在编译的时候生成行信息 <br>/map[:filename] 表示生成 MAP 文件的路径和文件名 <br>/mapinfo:lines 表示生成 MAP 文件时，加入行信息 <br>/mapinfo:exports 表示生成 MAP 文件时，加入 exported functions （如果生成的是 DLL 文件，这个选项就要加上） </p>
<p>OK，通过上面的步骤，我们已经得到了 MAP 文件，那么我们该如何利用它呢？ </p>
<p>让我们从简单的实例入手，请打开你的 VC ，新建这样一个文件： <br>11 <br>12 void Crash(void) <br>13 { <br>14 int i = 1; <br>15 int j = 0; <br>16 i /= j; <br>17 } <br>18 <br>19 void main(void) <br>20 { <br>21 Crash(); <br>22 } </p>
<p>很显然本程序有&#8220;除0错误&#8221;，在 Debug 方式下编译的话，运行时肯定会产生&#8220;非法操作&#8221;。好，让我们运行它，果然，&#8220;非法操作&#8221;对话框出现了，这时我们点击&#8220;详细信息&#8221;按钮，记录下产生崩溃的地址--在我的机器上是 0x0040104a 。 </p>
<p>再看看它的 MAP 文件：（由于文件内容太长，中间没用的部分我进行了省略） </p>
<p>CrashDemo </p>
<p>Timestamp is 3e430a76 (Fri Feb 07 09:23:02 2003) </p>
<p>Preferred load address is 00400000 </p>
<p>Start Length Name Class <br>0001:00000000 0000de04H .text CODE <br>0001:0000de04 0001000cH .textbss CODE <br>0002:00000000 00001346H .rdata DATA <br>0002:00001346 00000000H .edata DATA <br>0003:00000000 00000104H .CRT$XCA DATA <br>0003:00000104 00000104H .CRT$XCZ DATA <br>0003:00000208 00000104H .CRT$XIA DATA <br>0003:0000030c 00000109H .CRT$XIC DATA <br>0003:00000418 00000104H .CRT$XIZ DATA <br>0003:0000051c 00000104H .CRT$XPA DATA <br>0003:00000620 00000104H .CRT$XPX DATA <br>0003:00000724 00000104H .CRT$XPZ DATA <br>0003:00000828 00000104H .CRT$XTA DATA <br>0003:0000092c 00000104H .CRT$XTZ DATA <br>0003:00000a30 00000b93H .data DATA <br>0003:000015c4 00001974H .bss DATA <br>0004:00000000 00000014H .idata$2 DATA <br>0004:00000014 00000014H .idata$3 DATA <br>0004:00000028 00000110H .idata$4 DATA <br>0004:00000138 00000110H .idata$5 DATA <br>0004:00000248 000004afH .idata$6 DATA </p>
<p>Address Publics by Value Rva+Base Lib:Object </p>
<p>0001:00000020 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#67;&#114;&#97;&#115;&#104;&#64;&#64;&#89;&#65;&#88;&#88;&#90;">?Crash@@YAXXZ</a> 00401020 f CrashDemo.obj <br>0001:00000070 _main 00401070 f CrashDemo.obj <br>0004:00000000 __IMPORT_DESCRIPTOR_KERNEL32 00424000 kernel32:KERNEL32.dll</p>
<p>&nbsp;</p>
<p>0004:00000014 __NULL_IMPORT_DESCRIPTOR 00424014 kernel32:KERNEL32.dll <br>0004:00000138 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#67;&#111;&#109;&#109;&#97;&#110;&#100;&#76;&#105;&#110;&#101;&#65;&#64;&#48;">__imp__GetCommandLineA@0</a> 00424138 kernel32:KERNEL32.dll <br>0004:0000013c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#86;&#101;&#114;&#115;&#105;&#111;&#110;&#64;&#48;">__imp__GetVersion@0</a> 0042413c kernel32:KERNEL32.dll <br>0004:00000140 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#69;&#120;&#105;&#116;&#80;&#114;&#111;&#99;&#101;&#115;&#115;&#64;&#52;">__imp__ExitProcess@4</a> 00424140 kernel32:KERNEL32.dll <br>0004:00000144 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#68;&#101;&#98;&#117;&#103;&#66;&#114;&#101;&#97;&#107;&#64;&#48;">__imp__DebugBreak@0</a> 00424144 kernel32:KERNEL32.dll <br>0004:00000148 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#83;&#116;&#100;&#72;&#97;&#110;&#100;&#108;&#101;&#64;&#52;">__imp__GetStdHandle@4</a> 00424148 kernel32:KERNEL32.dll <br>0004:0000014c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#87;&#114;&#105;&#116;&#101;&#70;&#105;&#108;&#101;&#64;&#50;&#48;">__imp__WriteFile@20</a> 0042414c kernel32:KERNEL32.dll <br>0004:00000150 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#73;&#110;&#116;&#101;&#114;&#108;&#111;&#99;&#107;&#101;&#100;&#68;&#101;&#99;&#114;&#101;&#109;&#101;&#110;&#116;&#64;&#52;">__imp__InterlockedDecrement@4</a> 00424150 kernel32:KERNEL32.dll <br>0004:00000154 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#79;&#117;&#116;&#112;&#117;&#116;&#68;&#101;&#98;&#117;&#103;&#83;&#116;&#114;&#105;&#110;&#103;&#65;&#64;&#52;">__imp__OutputDebugStringA@4</a> 00424154 kernel32:KERNEL32.dll <br>0004:00000158 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#80;&#114;&#111;&#99;&#65;&#100;&#100;&#114;&#101;&#115;&#115;&#64;&#56;">__imp__GetProcAddress@8</a> 00424158 kernel32:KERNEL32.dll <br>0004:0000015c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#76;&#111;&#97;&#100;&#76;&#105;&#98;&#114;&#97;&#114;&#121;&#65;&#64;&#52;">__imp__LoadLibraryA@4</a> 0042415c kernel32:KERNEL32.dll <br>0004:00000160 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#73;&#110;&#116;&#101;&#114;&#108;&#111;&#99;&#107;&#101;&#100;&#73;&#110;&#99;&#114;&#101;&#109;&#101;&#110;&#116;&#64;&#52;">__imp__InterlockedIncrement@4</a> 00424160 kernel32:KERNEL32.dll <br>0004:00000164 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#77;&#111;&#100;&#117;&#108;&#101;&#70;&#105;&#108;&#101;&#78;&#97;&#109;&#101;&#65;&#64;&#49;&#50;">__imp__GetModuleFileNameA@12</a> 00424164 kernel32:KERNEL32.dll <br>0004:00000168 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#84;&#101;&#114;&#109;&#105;&#110;&#97;&#116;&#101;&#80;&#114;&#111;&#99;&#101;&#115;&#115;&#64;&#56;">__imp__TerminateProcess@8</a> 00424168 kernel32:KERNEL32.dll <br>0004:0000016c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#67;&#117;&#114;&#114;&#101;&#110;&#116;&#80;&#114;&#111;&#99;&#101;&#115;&#115;&#64;&#48;">__imp__GetCurrentProcess@0</a> 0042416c kernel32:KERNEL32.dll <br>0004:00000170 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#85;&#110;&#104;&#97;&#110;&#100;&#108;&#101;&#100;&#69;&#120;&#99;&#101;&#112;&#116;&#105;&#111;&#110;&#70;&#105;&#108;&#116;&#101;&#114;&#64;&#52;">__imp__UnhandledExceptionFilter@4</a> 00424170 kernel32:KERNEL32.dll <br>0004:00000174 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#70;&#114;&#101;&#101;&#69;&#110;&#118;&#105;&#114;&#111;&#110;&#109;&#101;&#110;&#116;&#83;&#116;&#114;&#105;&#110;&#103;&#115;&#65;&#64;&#52;">__imp__FreeEnvironmentStringsA@4</a> 00424174 kernel32:KERNEL32.dll <br>0004:00000178 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#70;&#114;&#101;&#101;&#69;&#110;&#118;&#105;&#114;&#111;&#110;&#109;&#101;&#110;&#116;&#83;&#116;&#114;&#105;&#110;&#103;&#115;&#87;&#64;&#52;">__imp__FreeEnvironmentStringsW@4</a> 00424178 kernel32:KERNEL32.dll <br>0004:0000017c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#87;&#105;&#100;&#101;&#67;&#104;&#97;&#114;&#84;&#111;&#77;&#117;&#108;&#116;&#105;&#66;&#121;&#116;&#101;&#64;&#51;&#50;">__imp__WideCharToMultiByte@32</a> 0042417c kernel32:KERNEL32.dll <br>0004:00000180 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#69;&#110;&#118;&#105;&#114;&#111;&#110;&#109;&#101;&#110;&#116;&#83;&#116;&#114;&#105;&#110;&#103;&#115;&#64;&#48;">__imp__GetEnvironmentStrings@0</a> 00424180 kernel32:KERNEL32.dll <br>0004:00000184 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#69;&#110;&#118;&#105;&#114;&#111;&#110;&#109;&#101;&#110;&#116;&#83;&#116;&#114;&#105;&#110;&#103;&#115;&#87;&#64;&#48;">__imp__GetEnvironmentStringsW@0</a> 00424184 kernel32:KERNEL32.dll <br>0004:00000188 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#83;&#101;&#116;&#72;&#97;&#110;&#100;&#108;&#101;&#67;&#111;&#117;&#110;&#116;&#64;&#52;">__imp__SetHandleCount@4</a> 00424188 kernel32:KERNEL32.dll <br>0004:0000018c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#70;&#105;&#108;&#101;&#84;&#121;&#112;&#101;&#64;&#52;">__imp__GetFileType@4</a> 0042418c kernel32:KERNEL32.dll <br>0004:00000190 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#83;&#116;&#97;&#114;&#116;&#117;&#112;&#73;&#110;&#102;&#111;&#65;&#64;&#52;">__imp__GetStartupInfoA@4</a> 00424190 kernel32:KERNEL32.dll <br>0004:00000194 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#72;&#101;&#97;&#112;&#68;&#101;&#115;&#116;&#114;&#111;&#121;&#64;&#52;">__imp__HeapDestroy@4</a> 00424194 kernel32:KERNEL32.dll <br>0004:00000198 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#72;&#101;&#97;&#112;&#67;&#114;&#101;&#97;&#116;&#101;&#64;&#49;&#50;">__imp__HeapCreate@12</a> 00424198 kernel32:KERNEL32.dll <br>0004:0000019c <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#72;&#101;&#97;&#112;&#70;&#114;&#101;&#101;&#64;&#49;&#50;">__imp__HeapFree@12</a> 0042419c kernel32:KERNEL32.dll <br>0004:000001a0 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#86;&#105;&#114;&#116;&#117;&#97;&#108;&#70;&#114;&#101;&#101;&#64;&#49;&#50;">__imp__VirtualFree@12</a> 004241a0 kernel32:KERNEL32.dll <br>0004:000001a4 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#82;&#116;&#108;&#85;&#110;&#119;&#105;&#110;&#100;&#64;&#49;&#54;">__imp__RtlUnwind@16</a> 004241a4 kernel32:KERNEL32.dll <br>0004:000001a8 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#76;&#97;&#115;&#116;&#69;&#114;&#114;&#111;&#114;&#64;&#48;">__imp__GetLastError@0</a> 004241a8 kernel32:KERNEL32.dll <br>0004:000001ac <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#83;&#101;&#116;&#67;&#111;&#110;&#115;&#111;&#108;&#101;&#67;&#116;&#114;&#108;&#72;&#97;&#110;&#100;&#108;&#101;&#114;&#64;&#56;">__imp__SetConsoleCtrlHandler@8</a> 004241ac kernel32:KERNEL32.dll <br>0004:000001b0 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#73;&#115;&#66;&#97;&#100;&#87;&#114;&#105;&#116;&#101;&#80;&#116;&#114;&#64;&#56;">__imp__IsBadWritePtr@8</a> 004241b0 kernel32:KERNEL32.dll <br>0004:000001b4 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#73;&#115;&#66;&#97;&#100;&#82;&#101;&#97;&#100;&#80;&#116;&#114;&#64;&#56;">__imp__IsBadReadPtr@8</a> 004241b4 kernel32:KERNEL32.dll <br>0004:000001b8 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#72;&#101;&#97;&#112;&#86;&#97;&#108;&#105;&#100;&#97;&#116;&#101;&#64;&#49;&#50;">__imp__HeapValidate@12</a> 004241b8 kernel32:KERNEL32.dll <br>0004:000001bc <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#67;&#80;&#73;&#110;&#102;&#111;&#64;&#56;">__imp__GetCPInfo@8</a> 004241bc kernel32:KERNEL32.dll <br>0004:000001c0 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#65;&#67;&#80;&#64;&#48;">__imp__GetACP@0</a> 004241c0 kernel32:KERNEL32.dll <br>0004:000001c4 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#79;&#69;&#77;&#67;&#80;&#64;&#48;">__imp__GetOEMCP@0</a> 004241c4 kernel32:KERNEL32.dll <br>0004:000001c8 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#72;&#101;&#97;&#112;&#65;&#108;&#108;&#111;&#99;&#64;&#49;&#50;">__imp__HeapAlloc@12</a> 004241c8 kernel32:KERNEL32.dll <br>0004:000001cc <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#86;&#105;&#114;&#116;&#117;&#97;&#108;&#65;&#108;&#108;&#111;&#99;&#64;&#49;&#54;">__imp__VirtualAlloc@16</a> 004241cc kernel32:KERNEL32.dll <br>0004:000001d0 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#72;&#101;&#97;&#112;&#82;&#101;&#65;&#108;&#108;&#111;&#99;&#64;&#49;&#54;">__imp__HeapReAlloc@16</a> 004241d0 kernel32:KERNEL32.dll <br>0004:000001d4 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#77;&#117;&#108;&#116;&#105;&#66;&#121;&#116;&#101;&#84;&#111;&#87;&#105;&#100;&#101;&#67;&#104;&#97;&#114;&#64;&#50;&#52;">__imp__MultiByteToWideChar@24</a> 004241d4 kernel32:KERNEL32.dll <br>0004:000001d8 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#76;&#67;&#77;&#97;&#112;&#83;&#116;&#114;&#105;&#110;&#103;&#65;&#64;&#50;&#52;">__imp__LCMapStringA@24</a> 004241d8 kernel32:KERNEL32.dll <br>0004:000001dc <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#76;&#67;&#77;&#97;&#112;&#83;&#116;&#114;&#105;&#110;&#103;&#87;&#64;&#50;&#52;">__imp__LCMapStringW@24</a> 004241dc kernel32:KERNEL32.dll <br>0004:000001e0 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#83;&#116;&#114;&#105;&#110;&#103;&#84;&#121;&#112;&#101;&#65;&#64;&#50;&#48;">__imp__GetStringTypeA@20</a> 004241e0 kernel32:KERNEL32.dll <br>0004:000001e4 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#71;&#101;&#116;&#83;&#116;&#114;&#105;&#110;&#103;&#84;&#121;&#112;&#101;&#87;&#64;&#49;&#54;">__imp__GetStringTypeW@16</a> 004241e4 kernel32:KERNEL32.dll <br>0004:000001e8 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#83;&#101;&#116;&#70;&#105;&#108;&#101;&#80;&#111;&#105;&#110;&#116;&#101;&#114;&#64;&#49;&#54;">__imp__SetFilePointer@16</a> 004241e8 kernel32:KERNEL32.dll <br>0004:000001ec <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#83;&#101;&#116;&#83;&#116;&#100;&#72;&#97;&#110;&#100;&#108;&#101;&#64;&#56;">__imp__SetStdHandle@8</a> 004241ec kernel32:KERNEL32.dll <br>0004:000001f0 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#70;&#108;&#117;&#115;&#104;&#70;&#105;&#108;&#101;&#66;&#117;&#102;&#102;&#101;&#114;&#115;&#64;&#52;">__imp__FlushFileBuffers@4</a> 004241f0 kernel32:KERNEL32.dll <br>0004:000001f4 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#95;&#105;&#109;&#112;&#95;&#95;&#67;&#108;&#111;&#115;&#101;&#72;&#97;&#110;&#100;&#108;&#101;&#64;&#52;">__imp__CloseHandle@4</a> 004241f4 kernel32:KERNEL32.dll <br>0004:000001f8 \177KERNEL32_NULL_THUNK_DATA 004241f8 kernel32:KERNEL32.dll<br>entry point at 0001:000000f0 </p>
<p><br>Line numbers for .\Debug\CrashDemo.obj(d:\msdev\myprojects\crashdemo\crashdemo.cpp) segment .text </p>
<p>13 0001:00000020 14 0001:00000038 15 0001:0000003f 16 0001:00000046 <br>17 0001:00000050 20 0001:00000070 21 0001:00000088 22 0001:0000008d </p>
<p>如果仔细浏览 Rva+Base 这栏，你会发现第一个比崩溃地址 0x0040104a 大的函数地址是 0x00401070 ，所以在 0x00401070 这个地址之前的那个入口就是产生崩溃的函数，也就是这行： </p>
<p>0001:00000020 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#67;&#114;&#97;&#115;&#104;&#64;&#64;&#89;&#65;&#88;&#88;&#90;">?Crash@@YAXXZ</a> 00401020 f CrashDemo.obj </p>
<p>因此，发生崩溃的函数就是 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#67;&#114;&#97;&#115;&#104;&#64;&#64;&#89;&#65;&#88;&#88;&#90;">?Crash@@YAXXZ</a> ，所有以问号开头的函数名称都是 C++ 修饰的名称。在我们的源程序中，也就是 Crash() 这个子函数。 </p>
<p>OK，现在我们轻而易举地便知道了发生崩溃的函数名称，你是不是很兴奋呢？呵呵，先别忙，接下来，更厉害的招数要出场了。 </p>
<p>请注意 MAP 文件的最后部分--代码行信息（Line numbers information），它是以这样的形式显示的： </p>
<p>13 0001:00000020 </p>
<p>第一个数字代表在源代码中的代码行号，第二个数是该代码行在所属的代码段中的偏移量。 </p>
<p>如果要查找代码行号，需要使用下面的公式做一些十六进制的减法运算： </p>
<p>崩溃行偏移 = 崩溃地址（Crash Address） - 基地址（ImageBase Address） - 0x1000 </p>
<p>为什么要这样做呢？细心的朋友可能会留意到 Rva+Base 这栏了，我们得到的崩溃地址都是由 偏移地址（Rva）+ 基地址（Base） 得来的，所以在计算行号的时候要把基地址减去，一般情况下，基地址的值是 0x00400000 。另外，由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的，所以也必须减去 0x1000 。 </p>
<p>好了，明白了这点，我们就可以来进行小学减法计算了： </p>
<p>崩溃行偏移 = 0x0040104a - 0x00400000 - 0x1000 = 0x4a </p>
<p>如果浏览 MAP 文件的代码行信息，会看到不超过计算结果，但却最接近的数是 CrashDemo.cpp 文件中的： </p>
<p>16 0001:00000046 </p>
<p>也就是在源代码中的第 16 行，让我们来看看源代码: </p>
<p>16 i /= j; </p>
<p>哈！！！果然就是第 16 行啊！ </p>
<p>兴奋吗？我也一样！ ：） </p>
<p>方法已经介绍完了，从今以后，我们就可以精确地定位到源代码中的崩溃行，而且只要编译器可以生成 MAP 文件（包括 VC、MASM、VB、BCB、Delphi&#8230;&#8230;），本方法都是适用的。我们时常抱怨 M$ 的产品如何如何差，但其实 M$ 还是有意无意间提供了很多有价值的信息给我们的，只是我们往往不懂得怎么利用而已&#8230;&#8230;相信这样一来，你就可以更为从容地面对&#8220;非法操作&#8221;提示了。你甚至可以要求用户提供崩溃的地址，然后就可以坐在家中舒舒服服地找到出错的那行，并进行修正。&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/baoyz/aggbug/107472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/baoyz/" target="_blank">云竹</a> 2010-02-08 09:12 <a href="http://www.cppblog.com/baoyz/articles/107472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自制的一个封装类</title><link>http://www.cppblog.com/baoyz/articles/102705.html</link><dc:creator>云竹</dc:creator><author>云竹</author><pubDate>Mon, 07 Dec 2009 03:12:00 GMT</pubDate><guid>http://www.cppblog.com/baoyz/articles/102705.html</guid><wfw:comment>http://www.cppblog.com/baoyz/comments/102705.html</wfw:comment><comments>http://www.cppblog.com/baoyz/articles/102705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/baoyz/comments/commentRss/102705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/baoyz/services/trackbacks/102705.html</trackback:ping><description><![CDATA[<p>源码下载：<a href="http://www.cppblog.com/Files/baoyz/MYPASS.rar">MYPASS.rar</a><br><br>主要功能<br>1、弹出对话框获得路径<br>static CString&nbsp;CMYPASS::byz_GetPath(CString strInput);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //strInput:对话框提示语<br>返回：全路径名。取消为空。<br><br>2、弹出打开保存文件对话框<br>static CString&nbsp;CMYPASS::byz_GetFile(CString strFilter ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//扩展名过滤器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL bOpensave = TRUE , //TRUE打开，FALSE保存<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strFilename = "",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //默认文件名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString&nbsp;strExt = "");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //默认扩展名;<br>返回：全文件名。取消为空。<br><br>3、防重复开启，本程序只开启一次<br>static BOOL CMYPASS::byz_Once();&nbsp;&nbsp;&nbsp; //提示是否关闭前次<br>返回：TRUE关闭前一次程序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE关闭本次程序。在调用程序后加ONCANCEL。</p>
<br>4、获得本文件名<br>static CString CMYPASS::byz_Myname(int i);&nbsp; //i:0 &nbsp;获得全路径&nbsp;&nbsp; i:1&nbsp; 获得文件名<br>返回：全路径或文件名。<br><br>5、按键型密码，输出某个资源文件<br>static BOOL byz_Message(MSG* pMsg,&nbsp;&nbsp;&nbsp;&nbsp;//主程序BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 的参数<br>int iID,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出资源ID号<br>int ID = IDCANCEL,&nbsp;&nbsp;&nbsp; //现有控件ID号<br>HWND hwnd = GetForegroundWindow()&nbsp; //指定对话框句柄<br>); <br>使用方法：将焦点移动到ID控件上，按键输入密码，使用鼠标移动控件出现新控件，点击新控件后输出资源文件iID。<br><br><br>在主程序退出时调用static void byz_Quit();<br>
<img src ="http://www.cppblog.com/baoyz/aggbug/102705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/baoyz/" target="_blank">云竹</a> 2009-12-07 11:12 <a href="http://www.cppblog.com/baoyz/articles/102705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>