1.1产生dump工具比较
有5种产生用户态dump文件的工具,包括ADPlus、Dr.Watson、CDB 和、WinDbg和userDump。
其中ADPlus是目前最好的工具。抓crash的具体命令为:
adplus.vbs -crash -pn TMSACSDm.exe -fullonfirst -o c:\dumps
注意必须在进程起起来后,并在crash之前启动ADPlus。
1.2WinDbg设置symbol环境变量和路径_NT_SYMBOL_PATH=srv*c:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*c:\mysymbols
同时,在WinDbg中设置Symbol File Path为同样的值。
1.3PDB文件
PDB文件为符号文件,包含了二进制文件的调试信息,符号文件包括全局变量、局部变量、函数名和它们的入口地址、FPO(Frame Pointer Omisson)数据。Frame Pointer是一种用来在调用堆栈中找到下一个将要被调用的函数的数据结构源代码的行序号。1.2节设置的路径就是用来查找PDB文件的,包括系统的符号文件,将从微软网站自动下载。【url:http://www.vckbase.com/index.php/wv/1418.html符号文件——Windows 应用程序调试必备】
WinDbg系列工具中symchk.exe可用于检查exe和pdb文件是否匹配
symchk.exe TMSACSDm.exe /v /s ./
[url: 关于PDB与EXE/DLL 文件的匹配问题:
http://blogold.chinaunix.net/u/8681/showart_2217695.html]
2.1进程Crash实例
(1)将软件对应pdb文件,包括dll和lib的pdb文件拷贝到c:\mysymbols中
(2)开启进程
(3)运行adplus.vbs -crash -pn TMSACSDm.exe -fullonfirst -o c:\dumps
(4)进程crash
(5)查看c:\dumps下dump文件
(6)windbg->file->Open Crash Dump
(7)!analyze –v综合分析crash情况
(8)kb显示堆栈
(9)ln addressA,显示addressA地址附近的符号
2.2利用map和cod文件找到崩溃地址对应代码
(1)设置linker-debugging-Generate Map File 为 YES
(2)设置C/C++-Output Files-Assembler Output 为 Assembly, Machine Code and Source (/FAcs)
(3)从map文件中,找到比崩溃地址(0x00411a84)小的最大的地址(0x00411a30),从而找到崩溃的函数名
(4)用崩溃地址减去崩溃函数地址,得到偏移地址(0x54),从cod文件中找到偏移地址为0x54的行,发现对应的代码行为(int b = 123/a;)
[url: http://blog.csdn.net/zhuzhu101011/article/details/4257108利用map和cod文件查出崩溃代码行]
// test123.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
int n = 30000;
while( n )
{
printf( "n is %d\n",n );
n--;
}
int b = 123/a;
return 0;
}
2.3进程消耗CPU实例
(1)通过任务管理器,找到消耗CPU多的进程
(2)用windbg附上这个进程
(3)!runaway 3显示每个线程用户模式和内核时间
(4)g运行一段时间,然后ctrl+c再次暂停程序
(5)再次运行!runaway 3,显示每个线程消耗的时间。对比两次!runaway 3命令的运行结果,可以得出消耗CPU最多的线程是哪个
测试程序如下:[http://blog.csdn.net/hgy413/article/details/7564252 Windbg命令学习6(!runaway和~)]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
DWORD WINAPI thread_fun1(LPVOID n)
{
while(1)
{
printf( "thread_fun1\n" );
}
}
DWORD WINAPI thread_fun2(LPVOID n)
{
Sleep(10000);
}
DWORD WINAPI thread_fun3(LPVOID n)
{
Sleep(5000);
}
int main()
{
HANDLE hThrd;
DWORD threadId;
hThrd = CreateThread(NULL,
0,
thread_fun1,
(LPVOID)1,
0,
&threadId);
printf("Start the first thread[%d]\n",threadId);
hThrd = CreateThread(NULL,
0,
thread_fun2,
(LPVOID)1,
0,
&threadId);
printf("Start the second thread[%d]\n",threadId);
hThrd = CreateThread(NULL,
0,
thread_fun3,
(LPVOID)1,
0,
&threadId);
printf("Start the third thread[%d]\n",threadId);
while(1)
{
}
}
2.4判断死锁hang住问题
(1)将windbg附到挂住的进程
或者使用ADPlus -hang -pn dead_mutex_lock.exe –o C:\dumps将dump保存下来
(2)用命令~显示所有的线程
(3)然后~ns命令将第n个线程设定为当前线程
(4)最后kb显示当前线程的调用栈
具体例子见:
#include <windows.h>
#include <stdio.h>
HANDLE hMutex1;
HANDLE hMutex2;
DWORD WINAPI thread_fun1(LPVOID n)
{
WaitForSingleObject(hMutex1,INFINITE);
Sleep(1000);
WaitForSingleObject(hMutex2,INFINITE);
printf("mutex 1 --> mutex 2 is running\n");
ReleaseMutex(hMutex2);
ReleaseMutex(hMutex1);
}
DWORD WINAPI thread_fun2(LPVOID n)
{
WaitForSingleObject(hMutex2,INFINITE);
WaitForSingleObject(hMutex1,INFINITE);
printf("mutex 2 ---> mutex 1 is running\n");
ReleaseMutex(hMutex1);
ReleaseMutex(hMutex2);
}
int main(int argc, char argv[] )
{
HANDLE hThrd;
DWORD threadId;
hMutex1=CreateMutex(NULL,FALSE,"tickets1");
hMutex2=CreateMutex(NULL,FALSE,"tickets2");
hThrd = CreateThread(NULL,
0,
thread_fun1,
(LPVOID)1,
0,
&threadId);
hThrd = CreateThread(NULL,
0,
thread_fun2,
(LPVOID)1,
0,
&threadId);
Sleep(100000);
}
分享到:
相关推荐
综上所述,这篇文章提供了一个系统性的方法论,通过案例引导读者理解并实践高效排错的技术,涵盖了从基础到高级的诸多排错知识,对于希望提升Windows用户态程序排错能力的IT专业人员具有很高的参考价值。
《Windows用户态程序高效排错》是熊力撰写的一本技术书籍,主要针对Windows操作系统下进行用户态程序的调试和问题解决。这本书深入浅出地介绍了如何在Windows环境下高效地定位和解决用户态程序的错误,是软件开发...
《Windows用户态程序高效排错》一书主要探讨了在Windows操作系统环境下,如何有效地诊断和解决用户模式程序的问题。作者熊力通过自己的实践经验和案例分享,旨在帮助开发者、测试人员以及技术支持人员提升排错效率。...
"Debugging Windows Programs"是一本专为此主题编写的书籍,旨在帮助开发者深入理解并掌握Windows环境下的调试技术。 调试是软件开发过程中不可或缺的部分,它允许开发者找出代码中的错误、性能瓶颈以及不正常的...
通过以上对《Windows用户态程序高效排错》文章的深入解析,我们可以看到排错不仅是一项技术活动,更是一种思维训练。无论是在开发还是支持阶段,培养良好的排错习惯和技巧都是非常重要的。希望本文能够为你在日常...
"Windows用户态高效排错"这个教程可能包含了多种方法和技术,帮助我们定位并解决用户空间程序运行时出现的问题。让我们深入探讨一下这个主题可能涵盖的一些关键知识点。 1. **调试基础知识**:排错通常涉及使用调试...
总的来说,“昆仑通态物联网”和“MCGS调试助手”结合使用,为用户提供了从远程监控到现场调试的一体化解决方案,极大地提升了工业自动化系统的智能化水平和运维效率。无论是大型工厂的复杂生产线,还是小型企业的...
本压缩包文件"Windows用户态程序高效排错(01-02).rar"可能包含了两部分教程或资料,旨在帮助用户深入理解和实践这一技术。 首先,我们要理解什么是用户态程序。在操作系统中,程序运行的状态分为用户态和内核态。...
《Windows用户态程序高效排错》是一本深入探讨Windows系统中用户态程序调试技术的宝贵资料,由熊力编著。这本书旨在帮助开发者和IT专业人员掌握如何在Windows环境中高效地定位和解决程序错误,提升软件质量。通过...
### Windows 用户态程序高效排错 #### 一、引言 在软件开发、测试和支持过程中,经常遇到程序的实际运行结果与预期不符的情况。这种问题的定位和解决过程被称为“排错”。尤其当问题难以重现或缺乏源代码时,排错...
### Windows用户态程序高效除错知识点总结 #### 核心概念与目的 - **文档概述**:《Windows用户态程序高效除错》是一份详细介绍了Windows环境下用户态程序排错技巧的专业文档。其目的是帮助软件开发者更有效地识别...
《Windows高级调试》一书深入探讨了Windows操作系统中的调试技术,是针对那些已经对Windows系统有一定了解并希望进一步提升调试技能的读者所准备的。这本书的英文版包含了丰富的代码示例,虽然由于文件大小限制,...
标题中的“McgsPro 3.3.2.5166 组态软件安装包”指的是昆仑通态公司的MCGS嵌入式组态软件的一个版本,这是一款广泛应用于...用户不仅可以安装和调试组态软件,还可以通过培训文档深入理解物联网技术和MCGS的使用方法。