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

转载于:https://www.cnblogs.com/symphonygcr/p/4060750.html

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

  1. FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。附文件重命名代码

    FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件.附文件重命名代码 问题: FileExistsError: [WinError 183] 当文件已存在时 ...

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

    一.引言 dump文件是C++程序发生异常时,保存当时程序运行状态的文件,是调试异常程序重要的方法,所以程序崩溃时,除了日志文件,dump文件便成了我们查找错误的最后一根救命的稻草.windows程序 ...

  3. VC开发程序创建Dump文件

    以前主要做Java开发,最近接手公司老项目做升级维护,开发工具是VC6,用了ACE和WxWidgets,当调试功能时,发现程序会出现内存访问异常,所以决定通过生成Dump文件进行分析,通过学习< ...

  4. ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法

    ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 参考文章: (1)ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析解决方法 (2)ht ...

  5. Visual Studio Code设置断点时出现Unverified breakpoint该咋办

    有的时候在Visual Studio Code里选中某一行设置断点,发现代码行号前面的圆圈是空心的, 而期望的断点设置成功后,显示是这样的: 空心的圆圈前面弹出的提示"Unverified ...

  6. 程序挂起时自动创建转储文件

    目录 介绍 背景 使用代码 介绍 我想知道当我的程序因意外异常而挂起时如何自动创建转储文件. 背景 有很多关于如何使用Window Command或Windbg程序创建转储文件的文章. 但是我的程序已 ...

  7. max_semi_space_size 设置值与实际值不一致的原因分析

    问题由来 因为业务的需求,某 Node.js 性能平台用户需要调节新生代大小,Node.js 的启动参数里面的max_semi_space_size可以设置新生代堆空间的大小. node --v8-o ...

  8. shell 获取ora报错信息_ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析...

    概述 前段时间使用的oracle 11g数据库,在用一段时间后(开始要较长时间才出现,后来较短时间就出现),频繁报ORA-04030错误,具体错误信息是 ORA-04030: 在尝试分配...字节(. ...

  9. Linux修改文件时间或创建新文件:touch

    每个文件在Linux下面都记录了许多的时间参数,其实是三个主要的变动时间 修改时间(modification time,mtime):当该文件的[内容数据]变更时,就会更新这个时间,内容数据是指文件的 ...

最新文章

  1. QT学习-核心类列表-33、QtTest 34、QtUiTools
  2. LCA 求 树中两个点的距离
  3. cvpr2019/cvpr2018/cvpr2017(Papers/Codes/Project/Paper reading)
  4. Python 日期和时间戳的转换
  5. 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
  6. 【Python学习】 - - 链表推导式[ 2*x for x in X ]、匿名函数、并行迭代
  7. 一些很有意思的JS现象
  8. java获取linux下面所有线程,获取Linux中Java线程的线程ID
  9. python 面试题 -------------- get 和 post 请求的 区别
  10. php 星座运势_星座运势查询示例代码
  11. JDK5.0新特性系列---11.5.4线程 同步装置之Exchanger
  12. 管理Exchange 2003注意事项
  13. 使用spring的事务的三种方法
  14. Uva--10098 (next_permutation)
  15. flutter学习之基础组件(一)
  16. Ubuntu 12.04安装QQ2012(12.10也可以,试过了的,其他版本没事过)
  17. unity旗帜飘动shader
  18. AI基础原理篇(一)
  19. 如何入职阿里前端岗?
  20. 名字生成器 php,中文名字随机生成器

热门文章

  1. SQL Server 表分区注意事项(转载)
  2. colease函数 mysql_SqlConnection 概述
  3. python界面设计-手把手教你用Python设计一个简单的命令行界面
  4. python快速编程入门教程-半小时带你快速入门Python编程,Python快速入门教程
  5. python stm32-STM32F4系列使用MicroPython开发
  6. python语言编程环境-python语言开发搭建电脑环境的方法
  7. python while循环语句-Python While 循环语句
  8. python语法大全-总结了Python中的22个基本语法
  9. python软件开发的一般流程-django最快程序开发流程详解
  10. python编程需要什么软件-python编程用哪个软件