• 利用WinDbg找出程序崩溃的代码行号


    之前碰到论坛里有几个好友,说程序不时的崩溃,什么xxoo不能read的!

    如果光要是这个内存地址,估计你会疯掉~~

    所以分享一下基本的调试技巧,需要准备的工具有WinDbg + VC6.0,

    下面是自己整理的一份自动生成DUMP文件的源代码,只需要添加到工程即可,源代码如下:

    MiniDump.h
    MiniDump.cpp


    <具体请参考附件SRC中,太大就不贴了>

    1、在CXXDlg::OnInitDialog()中添加这样一段:
    1. BOOL CTestDlg::OnInitDialog()
    2. {
    3.         CDialog::OnInitDialog();
    4.    
    5.         // ......
    6.         SetUnhandledExceptionFilter(CrashReportEx);
    7.         HMODULE        hKernel32;

    8.         // Try to get MiniDumpWriteDump() address.
    9.         hDbgHelp = LoadLibrary("DBGHELP.DLL");
    10.         MiniDumpWriteDump_ = (MINIDUMP_WRITE_DUMP)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
    11.         //        d("hDbgHelp=%X, MiniDumpWriteDump_=%X", hDbgHelp, MiniDumpWriteDump_);
    12.        
    13.         // Try to get Tool Help library functions.
    14.         hKernel32 = GetModuleHandle("KERNEL32");
    15.         CreateToolhelp32Snapshot_ = (CREATE_TOOL_HELP32_SNAPSHOT)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot");
    16.         Module32First_ = (MODULE32_FIRST)GetProcAddress(hKernel32, "Module32First");
    17.         Module32Next_ = (MODULE32_NEST)GetProcAddress(hKernel32, "Module32Next");
    18. }
    复制代码
    下面是工程中的测试代码:
    1. class CTestDlg : public CDialog
    2. {
    3. // Construction
    4. public:
    5.         CTestDlg(CWnd* pParent = NULL);        // standard constructor

    6.         void Fun1(char *pszBuffer);
    7.         void Fun2(char *pszBuffer);
    8.         void Fun3(char *pszBuffer);
    9. };
    复制代码
    1. void CTestDlg::Fun1(char *pszBuffer)
    2. {
    3.         Fun2(pszBuffer);
    4. }

    5. void CTestDlg::Fun2(char *pszBuffer)
    6. {
    7.         Fun3(pszBuffer);
    8. }

    9. void CTestDlg::Fun3(char *pszBuffer)
    10. {
    11.         pszBuffer[1] = 0x00;
    12. }
    复制代码
    我们在双击确定按钮时的响应代码如下:
    1. void CTestDlg::OnOK()
    2. {
    3.         // TODO: Add extra validation here
    4.         Fun1(NULL);
    5. }
    复制代码


    2、设置VC编译选项,勾选生成MAP和Debug Info、Progma Datebase:

    1.jpg

    1.JPG


    3、将编译生成的Release目录中的pdb、map文件保存起来,以后调试会用到:
    2.jpg


    4、运行程序,单击确定按钮出现异常后自动重启,并创建一个Log文件夹,里面生成dump文件:
    3.jpg


    5、我们打开WinDbg,设置一下相关路径
        A、
    设置pdb路径(File \ Symbol File Path)
        PDBPath.jpg
        B、设置源代码路径( File \ Source File Path )
        SourcePath.jpg
        C、设置Exe路径( File \ Image File Path )
        ExePath.jpg

    6、用WiinDbg打开dump文件(File \ Open Crash Dump)
    5.jpg


    7、输入命令!analyze -v,等待几秒后会打印出错误信息,函数调用栈如下图:

    1. Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
    2. Copyright (c) Microsoft Corporation. All rights reserved.


    3. Loading Dump File [C:\Test\Release\Log\2012-05-29 160059.dmp]
    4. User Mini Dump File: Only registers, stack and portions of memory are available

    5. Symbol search path is: C:\Test\Release
    6. Executable search path is: C:\Test\Release
    7. Windows XP Version 2600 (Service Pack 3) MP (4 procs) Free x86 compatible
    8. Product: WinNt, suite: SingleUserTS
    9. Machine Name:
    10. Debug session time: Tue May 29 16:00:59.000 2012 (GMT+8)
    11. System Uptime: not available
    12. Process Uptime: 0 days 0:00:01.000
    13. ...................................
    14. This dump file has an exception of interest stored in it.
    15. The stored exception information can be accessed via .ecxr.
    16. (1710.1450): Access violation - code c0000005 (first/second chance not available)
    17. eax=00a80000 ebx=00157ea8 ecx=00000007 edx=7c92e514 esi=00157e80 edi=00157ed8
    18. eip=7c92e514 esp=0012e830 ebp=0012e840 iopl=0         nv up ei pl zr na pe nc
    19. cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
    20. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -
    21. ntdll!KiFastSystemCallRet:
    22. 7c92e514 c3              ret
    23. 0:000> !analyze -v
    24. *******************************************************************************
    25. *                                                                             *
    26. *                        Exception Analysis                                   *
    27. *                                                                             *
    28. *******************************************************************************

    29. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for mfc42.dll -
    30. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for user32.dll -
    31. ***** OS symbols are WRONG. Please fix symbols to do analysis.

    32. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for kernel32.dll -
    33. *************************************************************************
    34. ***                                                                   ***
    35. ***                                                                   ***
    36. ***    Your debugger is not using the correct symbols                 ***
    37. ***                                                                   ***
    38. ***    In order for this command to work properly, your symbol path   ***
    39. ***    must point to .pdb files that have full type information.      ***
    40. ***                                                                   ***
    41. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    42. ***    contain the required information.  Contact the group that      ***
    43. ***    provided you with these symbols if you need this command to    ***
    44. ***    work.                                                          ***
    45. ***                                                                   ***
    46. ***    Type referenced: IMAGE_NT_HEADERS32                            ***
    47. ***                                                                   ***
    48. *************************************************************************
    49. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for ole32.dll -
    50. *** ERROR: Symbol file could not be found.  Defaulted to export symbols for advapi32.dll -
    51. *************************************************************************
    52. ***                                                                   ***
    53. ***                                                                   ***
    54. ***    Your debugger is not using the correct symbols                 ***
    55. ***                                                                   ***
    56. ***    In order for this command to work properly, your symbol path   ***
    57. ***    must point to .pdb files that have full type information.      ***
    58. ***                                                                   ***
    59. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    60. ***    contain the required information.  Contact the group that      ***
    61. ***    provided you with these symbols if you need this command to    ***
    62. ***    work.                                                          ***
    63. ***                                                                   ***
    64. ***    Type referenced: kernel32!pNlsUserInfo                         ***
    65. ***                                                                   ***
    66. *************************************************************************
    67. *************************************************************************
    68. ***                                                                   ***
    69. ***                                                                   ***
    70. ***    Your debugger is not using the correct symbols                 ***
    71. ***                                                                   ***
    72. ***    In order for this command to work properly, your symbol path   ***
    73. ***    must point to .pdb files that have full type information.      ***
    74. ***                                                                   ***
    75. ***    Certain .pdb files (such as the public OS symbols) do not      ***
    76. ***    contain the required information.  Contact the group that      ***
    77. ***    provided you with these symbols if you need this command to    ***
    78. ***    work.                                                          ***
    79. ***                                                                   ***
    80. ***    Type referenced: kernel32!pNlsUserInfo                         ***
    81. ***                                                                   ***
    82. *************************************************************************

    83. FAULTING_IP:
    84. Test!CTestDlg::Fun3+6 [C:\Test\TestDlg.cpp @ 141]
    85. 00401ca6 c6400100        mov     byte ptr [eax+1],0

    86. EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
    87. ExceptionAddress: 00401ca6 (Test!CTestDlg::Fun3+0x00000006)
    88.    ExceptionCode: c0000005 (Access violation)
    89.   ExceptionFlags: 00000000
    90. NumberParameters: 2
    91.    Parameter[0]: 00000001
    92.    Parameter[1]: 00000001
    93. Attempt to write to address 00000001

    94. PROCESS_NAME:  Test.exe

    95. ADDITIONAL_DEBUG_TEXT: 
    96. Use '!findthebuild' command to search for the target build information.
    97. If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.

    98. MODULE_NAME: Test

    99. FAULTING_MODULE: 7c920000 ntdll

    100. DEBUG_FLR_IMAGE_TIMESTAMP:  4fc48236

    101. ERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"

    102. EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx"

    103. EXCEPTION_PARAMETER1:  00000001

    104. EXCEPTION_PARAMETER2:  00000001

    105. WRITE_ADDRESS:  00000001

    106. FOLLOWUP_IP:
    107. Test!CTestDlg::Fun3+6 [C:\Test\TestDlg.cpp @ 141]
    108. 00401ca6 c6400100        mov     byte ptr [eax+1],0

    109. FAULTING_THREAD:  00001450

    110. BUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_WRONG_SYMBOLS

    111. PRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_DEREFERENCE

    112. DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE

    113. LAST_CONTROL_TRANSFER:  from 00401c9c to 00401ca6

    114. STACK_TEXT: 
    115. 0012f89c 00401c9c 00000000 0012f8b4 00401c8c Test!CTestDlg::Fun3+0x6 [C:\Test\TestDlg.cpp @ 141]
    116. 0012f8a8 00401c8c 00000000 0012f8cc 00401f27 Test!CTestDlg::Fun2+0xc [C:\Test\TestDlg.cpp @ 137]
    117. 0012f8b4 00401f27 00000000 73d323eb 73dcf07c Test!CTestDlg::Fun1+0xc [C:\Test\TestDlg.cpp @ 132]
    118. 0012f8bc 73d323eb 73dcf07c 00000111 0012f8fc Test!CTestDlg::OnOK+0x7 [C:\Test\TestDlg.cpp @ 242]
    119. WARNING: Stack unwind information not available. Following frames may be wrong.
    120. 0012f8cc 73d322fd 0012fe94 00000001 00000000 mfc42!Ordinal567+0xa2
    121. 0012f8fc 73d976e5 00000001 00000000 00000000 mfc42!Ordinal4424+0x108
    122. 0012f920 73d33094 00000001 00000000 00000000 mfc42!Ordinal4431+0x1b
    123. 0012f970 73d31b58 00000000 0014120e 0012fe94 mfc42!Ordinal4441+0x51
    124. 0012f9f0 73d31b07 00000111 00000001 0014120e mfc42!Ordinal5163+0x2f
    125. 0012fa10 73d31a78 00000111 00000001 0014120e mfc42!Ordinal6374+0x22
    126. 0012fa70 73d319d0 0012fe94 00000000 00000111 mfc42!Ordinal1109+0x91
    127. 0012fa90 73dbe47c 0018124c 00000111 00000001 mfc42!Ordinal1578+0x34
    128. 0012fabc 77d18734 0018124c 00000111 00000001 mfc42!Ordinal1579+0x39
    129. 0012fae8 77d18816 73dbe443 0018124c 00000111 user32!GetDC+0x6d
    130. 0012fb50 77d2927b 00000000 73dbe443 0018124c user32!GetDC+0x14f
    131. 0012fb8c 77d292e3 006d5120 007101c8 00000001 user32!GetParent+0x16c
    132. 0012fbac 77d4ff7d 0018124c 00000111 00000001 user32!SendMessageW+0x49
    133. 0012fbc4 77d465d2 007156c0 00000000 007156c0 user32!CreateMDIWindowA+0x1bd
    134. 0012fbe0 77d25e94 001530ec 00000001 00000000 user32!DeregisterShellHookWindow+0x6312
    135. 0012fc64 77d3b082 007156c0 00000202 00000000 user32!IsDlgButtonChecked+0x109a
    136. 0012fc84 77d18734 0014120e 00000202 00000000 user32!SoftModalMessageBox+0xda3
    137. 0012fcb0 77d18816 77d3b036 0014120e 00000202 user32!GetDC+0x6d
    138. 0012fd18 77d189cd 00000000 77d3b036 0014120e user32!GetDC+0x14f
    139. 0012fd78 77d18a10 00404314 00000000 0012fdac user32!GetWindowLongW+0x127
    140. 0012fd88 77d274ff 00404314 00404314 0040431c user32!DispatchMessageW+0xf
    141. 0012fdac 77d3c6d3 0018124c 007156c0 00404314 user32!IsDialogMessageW+0xdb
    142. 0012fdcc 73d45202 0018124c 00404314 0012fe94 user32!IsDialogMessage+0x4a
    143. 0012fddc 73d39be0 00404314 73d451ce 00404314 mfc42!Ordinal4047+0x2f
    144. 0012ff00 73d3c1cf 006f0072 00142373 00000000 mfc42!Ordinal5278+0x29
    145. 004034c0 00401c20 004019f0 00401a00 00401a10 mfc42!Ordinal1576+0x47
    146. 004034c4 004019ef 00401a00 00401a10 00402130 Test!CTestDlg::`scalar deleting destructor'
    147. 004034c8 004019ff 00401a10 00402130 0040212a Test!CTestDlg::~CTestDlg+0xf
    148. 004034cc 00401a0f 00402130 0040212a 0040203a Test!CObject::Serialize+0xf
    149. 004034d0 00402130 0040212a 0040203a 00402034 Test!CObject::AssertValid+0xf
    150. 004034d4 0040212a 0040203a 00402034 0040202e Test!CDialog::OnCmdMsg
    151. 004034d8 0040203a 00402034 0040202e 00402028 Test!CWnd::OnFinalRelease
    152. 004034dc 00402034 0040202e 00402028 00402022 Test!CCmdTarget::IsInvokeAllowed
    153. 004034e0 0040202e 00402028 00402022 00401c70 Test!CCmdTarget::GetDispatchIID
    154. 004034e4 00402028 00402022 00401c70 0040201c Test!CCmdTarget::GetTypeInfoCount
    155. 004034e8 00402022 00401c70 0040201c 00402016 Test!CCmdTarget::GetTypeLibCache
    156. 004034ec 00401c6f 0040201c 00402016 00402010 Test!CCmdTarget::GetTypeLib
    157. 004034f0 0040201c 00402016 00402010 0040200a Test!CTestDlg::_GetBaseMessageMap+0xf
    158. 004034f4 00402016 00402010 0040200a 00402004 Test!CCmdTarget::GetCommandMap
    159. 004034f8 00402010 0040200a 00402004 00401ffe Test!CCmdTarget::GetDispatchMap
    160. 004034fc 0040200a 00402004 00401ffe 00401ff8 Test!CCmdTarget::GetConnectionMap
    161. 00403500 00402004 00401ffe 00401ff8 00401ff2 Test!CCmdTarget::GetInterfaceMap
    162. 00403504 00401ffe 00401ff8 00401ff2 00401fec Test!CCmdTarget::GetEventSinkMap
    163. 00403508 00401ff8 00401ff2 00401fec 00402124 Test!CCmdTarget::OnCreateAggregates
    164. 00403608 004022fc 00402310 00000000 19930520 Test!CCmdTarget::GetInterfaceHook
    165. 0040360c 00402310 00000000 19930520 00000008 Test!WinMainCRTStartup+0x13e
    166. 00403610 00000000 19930520 00000008 00403638 Test!WinMainCRTStartup+0x152


    167. STACK_COMMAND:  ~0s; .ecxr ; kb

    168. FAULTING_SOURCE_CODE: 
    169.    137: }
    170.    138:
    171.    139: void CTestDlg::Fun3(char *pszBuffer)
    172.    140: {
    173. >  141:         pszBuffer[1] = 0x00;
    174.    142: }
    175.    143:
    176.    144: BOOL CTestDlg::OnInitDialog()
    177.    145: {
    178.    146:         CDialog::OnInitDialog();


    179. SYMBOL_STACK_INDEX:  0

    180. SYMBOL_NAME:  Test!CTestDlg::Fun3+6

    181. FOLLOWUP_NAME:  MachineOwner

    182. IMAGE_NAME:  Test.exe

    183. BUCKET_ID:  WRONG_SYMBOLS

    184. FAILURE_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE_c0000005_Test.exe!CTestDlg::Fun3

    185. WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/Test_exe/1_0_0_1/4fc48236/Test_exe/1_0_0_1/4fc48236/c0000005/00001ca6.htm?Retriage=1

    186. Followup: MachineOwner
    187. ---------
    复制代码
    OK ,这样我们就能在发布版本的程序中,准确的定位到哪个函数出了问题,所以发布程序时,一定要记得生成pdb、map文件,不然客户运行出错的话,你不死也残!

    测试工程下载地址:
  • 相关阅读:
    把Chrome浏览器变成文本编辑器
    pigcms 标签读不出
    全排列函数
    线性基(二
    线性基(一
    fabs() abs()
    字面量声明的函数,后边最好加一个分号,否则的话,在控制台执行有问题的
    mongo集群
    linux的查找命令
    mysql 解决Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’错误
  • 原文地址:https://www.cnblogs.com/lidabo/p/2848677.html
Copyright © 2020-2023  润新知