ADPLUS使用配置文件设置断点时无法创建DUMP文件原因分析

ADPLUS简介

ADPLUS.vbs是Debugging Tool for Windows里带的一个VBS脚本。我们可以用它很方便地生成进程的内存转储文件。从Debugging Tool for Windows版本6.12.2.633后,ADPLUS.vbs被ADPLUS.EXE所替代。原有的VBS脚本更名为adplus_old.vbs.

背景

在一台服务器上,ASP.NET出现随机崩溃的情况。为了解决这个问题,我们决定用ADPLUS收集dump.

我们使用如下配置文件:

<ADPlus Version=‘2‘>

<Breakpoints>

<Breakpoint Name= "MyBP" Address="KERNEL32!ExitProcess">

<Actions>Log;Stacks;FullDump</Actions>

<ReturnAction> Q</ReturnAction>

</Breakpoint>

<Breakpoint Name= "MyBP2" Address="KERNEL32!TerminateProcess">

<Actions>Log;Stacks;FullDump</Actions>

<ReturnAction>Q</ReturnAction>

</Breakpoint>

</Breakpoints>

</ADPlus>

但奇怪的是却无法生成dump,在dump目录中只有一个Minidump.

检查

首先,我们检查Adplus日志文件。在这个文件中包含了CDB运行的所有信息,非常有用。在日志文件中,我们发现如下错误:

Unable to create file ‘MyBP2 c:\\dumps\\20101108_160516_Crash_Mode\\FULLDUMP_Breakpoint MyBP2_w3wp.exe__1c0c_2010-11-08_16-07-18-706_1d04.dmp‘ - Win32 error 0n123

"The filename, directory name, or volume label syntax is incorrect."

从名字上看,看起来CDB收到了一个非法的文件名。”MyBP2 c:\\dumps\\20101108_160516_Crash_Mode\\FULLDUMP_Breakpoint MyBP2_w3wp.exe__1c0c_2010-11-08_16-07-18-706_1d04.dmp” 看起来不象一个合法的文件名。这是怎么回事?

然后我们用ProcessMonitor监视adplus.exe和CDB.EXE,发现如下结果:

从名字上看,这个名字很明显有问题:

C:\Debuggers\MyBP2 c:\dumps\20101108_163827_Crash_Mode\FULLDUMP_Breakpoint MyBP2_w3wp.exe__12fc_2010-11-08_16-38-40-568_2940.dmp

前边多了个C:\Debuggers\MyBP2

这是怎么回事?

那个MyBp2是断点名字,为什么会出现dump文件名字中呢?我们继续从ADPLUS LOG中寻找线索:

0:027> *--- Configuring breakpoints ---

0:027> BP KERNEL32!TerminateProcess @".echo Breakpoint MyBP2;.echo;.echo Call stacks below ---;~*kvn250;.echo;.dump -u /ma /c Breakpoint MyBP2 ${AdpDumpDirEsc}\\FULLDUMP_Breakpoint MyBP2_${AdpProcName}_.dmp;Q"

请注意Breakpoint和MyBp2中间有个空格,难道这个命令有问题,我们用Windbg试一下:

1. 运行notepad

2. 把windbg附加过去,输入如下命令:

3. 出现的错误信息与日志中一致。

因此,可以确认是由于adplus.exe给CDB传了错误参数所致。

幸运的是adplus.exe是用.NET写的,我们可以用Reflector打开看看:

很快地我们可以发现.dump命令是KeyWord2Command生成的:

        private string KeyWord2Command(string KeyWord, string Context, bool UseEscapedFlnm)

{

switch (key)

{

case "MINIDUMP":

case "FULLDUMP":

case "CUSTOMDUMP":

{

str4 = ".dump -u " + str3;

if (Context != "")

{

str4 = str4 + " /c " + Context;

}

string str7 = str4;

return (str7 + " " + str2 + key + "_" + Context + "_${AdpProcName}_.dmp");

}

…}

根据Windbg的文档,/c参数要用引号包括,但这里没有。这应该是adplus.exe的一个bug.

我的ADPLUS版本为:7.01.002 02/27/2009

附录:

.NET Reflector

http://www.red-gate.com/products/reflector/

Process Monitor

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

Debugging Tool for Windows

http://www.microsoft.com/china/whdc/DevTools/Debugging/default.mspx

Robert

时间: 2024-08-11 17:47:25

ADPLUS使用配置文件设置断点时无法创建DUMP文件原因分析的相关文章

应用反射+配置文件+抽象工厂时出现的错误和原因分析

先来看一段程序: <pre name="code" class="vb">Imports System.Configuration '配置文件命名空间 Imports System.Reflection '反射命名空间 Imports IDAL '引用接口层 Public Class DataAccess '程序集名称(同时代表命名空间名称):DAL Private Shared ReadOnly AssemblyName As String = Sys

编写的windows程序,崩溃时产生crash dump文件的办法

一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序产生dump文件和linux程序产生dump文件的方式不一样,linux默认是不让产生core dump文件,只要在用户自己的~/.bash_profile文件中增加 ulimit -S -c unlimited > /dev/null 2>&1 这样程序崩溃就可以产生可调试的core d

Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += -g QMAKE_LINK += -g 在终端输入 ulimit -c 显示为 0 然后输入 ulimit -c unlimited 继续在终端运行编写的程序 出错后,会在当前目录生成 core 文件 然后在终端执行 “gdb 你的程序名 core” 然后输入 bt 对该错误进行跟踪调试 (gdb)

join时显示no join predicate原因分析以及解决办法

本位出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据,因为预期很快就可以查询出来结果的SQL,实则半个小时都出不来,后面会有截图 观察执行计划的时候发现中间有一步中出现一个类似如下非常规的连接提示警告,如下图 no join predicate 意思就是没有连接谓词,表之间join的时候没有指定连接谓词可以导致no join predicate, 但是

Linux高级编程--04.GDB调试程序(设置断点)

调试已运行的程序 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序. 先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID.并用detach来取消挂接的进程. 暂停 / 恢复程序运行 调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行.你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等.以便于你查看运行时的变量,以及运行时的流程. 当进程被gdb停住时,你可以使用info pr

Android Studio创建AIDL文件并实现进程间通讯

在Android系统中,跨进程通信是非常普遍的事情,它用到了Binder机制处理进程之间的交互.Binder机制会开放一些接口给java层,供android开发工程师调用进程之间通信.这些接口android封装到了AIDL文件里,当我们项目用到跨进程通信时可以创建.aidl文件,.aidl文件可以协助我们达到跨进程的通信.下面简单介绍用AndroidStudio创建AIDL文件的过程. a.新建AIDL文件 1.项目文件夹右键---> new --->选择AIDL 2.自定义一个接口名称 3.

dump文件的创建及使用

1.创建dump文件的原因 windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出,如果这时候没有dump文件的话,我们是没有得到任何程序退出的信息.在windows程序异常退出之前,会预先调用一个在程序中注册的异常处理回调函数(默认是没有设置),只要我们在这个回调函数中调用MiniDumpWriteDump函数就可以产生我们想要的dump文件. 2.实现 //minidump.h #pragma once #include <windo

让程序在崩溃时体面的退出之Dump文件

在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在程序崩溃时得到CallStack的方法.但是要想得到CallStack,必须有pdb文件的支持.但是普通情况下,公布出去的程序都是Release版本号的,都不会附带pdb文件.那么我们怎么能在程序崩溃的时候找到出错的详细位置呢?这个时候就该Dump文件出场了!Dump文件是进程的内存镜像,能够把程序执行时的状态完整的保存下来.         要想在程序崩溃的时候创建Dump文件,就须要用到DbgHelp.dll中Wind

VC研究: 使用tinyxml编译出现“fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾”

向项目添加tinyxml用于解析xml内容,总体来说tinyxml还是很方便. 编译时提示"fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾" 分析: 此错误发生的原因是VC编译器在寻找预编译头文件(默认#include "stdafx.h")时,文件未预期结束.也就是没有找到默认的预编译头文件"stdafx.h".而VC中创建每一个cpp默认都会加上"stdafx.h",但添加的第三方类库(比如t