var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年08月04日

    ADPlus

    分类:

    ADPlusMicrosoft产品支持服务(PSS)提供的一个基于控制台(调用cdb.exe)的Microsoft Visual Basic脚本工具,其全称为adplus.vbs,是Debugging Tools for Windows中的一部分,它可以解决停止响应(挂起)或失败(崩溃)的任何进程或应用程序的问题。

     

    WinDbg等调试器直接attach到需要调试的进程,调试完毕之后再detach,这个方式的缺点是执行debugger命令时必须先break这个进程,执行完debug命令之后又得F5继续运行,因为被你break住的时候意味着整个进程也已经被你挂起。另外也经常会由于First Chance Exception而自动break,你得时刻留意避免长时间break整个进程。所以这样的调试方式对时间是个很大的考验,往往没有充裕的时间来做仔细分析。

     

    另一种方式则是完成dump之后先detach,让进程继续运行。然后用WinDbg等调试器来分析这个抓取到的dump文件。

     

    当要抓取Visual Studio IDEdevenv.exe crash时的dump时,你会发现用常用的WinDbg等调试器直接attachdevenv.exe无法或不方便或者得到的dump文件未包含所要信息,这时可用adplus.vbs来完成:

    adplus -crash -pn devenv.exe -quiet -o c:\dumps

    这时adplus.vbs会在devenv.exe崩溃前监视,崩溃发生时自动生成dump,默认第一次异常生成mini dump,第二次异常生成full dump

     

    Windows操作系统异常最多给两轮处理机会,其中每一轮机会Windows都会先分发给调试器(若存在),然后再寻找异常处理器(VEHSHE等)。对于第一轮异常处理机会,调试器通常返回没有处理异常,然后让系统继续分发,交给程序中的异常处理器;对于第二轮机会,若调试器不处理,系统便会做最终决定:终止应用程序运行或系统蓝屏。对于Visual Studio异常过滤对话框,对每个异常,提供了两个选择:ThrownUser-unhandled,分别对映着第一轮机会中断给用户和第二轮机会中断给用户。

     

    Windows系统中的内核空间是单一的,所有进程的进程空间中的内核部分是共享的,但用户部分是独立的。如32Windows,单进程的进程空间为4GB,高2GB属于内核空间,每个进程的指向和取值是相同的;低2GB空间,其指向和取值依进程而定。

     

    进程地址空间如何分区

    分区

    x86 32Windows

    x86 32Windows带有3GB用户态

    x64 64Windows

    IA-64 64Windows

    NULL指针分配

    0x00000000

    0x00000000

    0x00000000'00000000

    0x00000000'00000000

    0x0000FFFF

    0x0000FFFF

    0x00000000'0000FFFF

    0x00000000'0000FFFF

    用户态

    0x00010000

    0x00010000

    0x00000000'00010000

    0x00000000'00010000

    0x7FFEFFFF

    0xBFFEFFFF

    0x000007FF'FFFEFFFF

    0x000006FB'FFFEFFFF

    64-KB禁止进入

    0x7FFF0000

    0xBFFF0000

    0x000007FF'FFFF0000

    0x000006FB'FFFF0000

    0x7FFFFFFF

    0xBFFFFFFF

    0x000007FF'FFFFFFFF

    0x000006FB'FFFFFFFF

    核心态

    0x80000000

    0xC0000000

    0x00000800'00000000

    0x000006FC'00000000

    0xFFFFFFFF

    0xFFFFFFFF

    0xFFFFFFFF'FFFFFFFF

     

    0x00000fff-0x00000000为防止使用空指针的4,096字节;

    0x003fffff-0x00001000MS-DOS Win16应用程序;

    0x7fffffff-0x00400000为每个进程的Win32专用地址;

    0xbfffffff-0x80000000(1GB)用于共享的Win32 dll、存储器映射文件与共享存储区;0xffffffff-0xc0000000(1GB)用于vxd、存储器管理与文件系统。以上都是指逻辑地址,也就是虚拟内存

     

    每当你保留地址空间的一个区域时,系统要确保该区域从一个分配粒度的边界开始。对于不同的CPU平台来说,分配粒度是各不相同的。但是,截止到目前,所有的CPU平台都使用64Kb这个相同的分配粒度。当你保留地址空间的一个区域时,系统还要确保该区域的大小是系统的页面大小的倍数。页面是系统在管理内存时使用的一个内存单位。与分配粒度一样,不同的CPU,其页面大小也是不同的。x86x64使用的页面大小是4 KB,而IA-64使用的页面大小则是8 KB

     

    若要使用已保留的地址空间区域,必须分配物理存储器,然后将该物理存储器映射到已保留的地址空间区域。这个过程称为提交物理存储器。物理存储器总是以页面的形式来提交的。若要将物理存储器提交给一个已保留的地址空间区域,要调用VirtualAlloc函数;当你的程序算法不再需要访问保留的地址空间区域已提交的物理存储器时,该物理存储器应该被释放。这个过程称为回收物理存储器,它是通过VirtualFree函数来完成的。

     

    操作系统与CPU相协调,共同将RAM的各个部分保存到页文件中,当运行的应用程序需要时,再将页文件的各个部分重新加载到RAM。由于页文件增加了应用程序可以使用的RAM的容量,因此页文件的使用是视情况而定的。这样,当一个应用程序通过调用VirtualAlloc函数,将物理存储器提交给地址空间的一个区域时,地址空间实际上是从硬盘上的一个文件中进行分配的。

     

    当你的进程中的一个线程试图访问进程的地址空间中的一个数据块时,将会发生两种情况之一。

    在第一种情况中,线程试图访问的数据是在RAM中。在这种情况下, C P U将数据的虚拟内存地址映射到内存的物理地址中,然后执行需要的访问。

    在第二种情况中,线程试图访问的数据不在RAM中,而是存放在页文件中的某个地方。这时,试图访问就称为页面失效,CPU将把试图进行的访问通知操作系统。这时操作系统就寻找RAM中的一个内存空页。如果找不到空页,系统必须释放一个空页。如果一个页面尚未被修改,系统就可以释放该页面。但是,如果系统需要释放一个已经修改的页面,那么它必须首先将该页面从RAM拷贝到页交换文件中,然后系统进入该页文件,找出需要访问的数据块,并将数据加载到空闲的内存页面。然后,操作系统更新它的用于指明数据的虚拟内存地址现在已经映射到RAM中的相应的物理存储器地址中的表。这时CPU重新运行生成初始页面失效的指令,但这次CPU能够将虚拟内存地址映射到一个物理RAM地址,并访问该数据块。

     

    CPU访问正确对齐的数据时,它的运行效率最高。当数据大小的数据模数的内存地址是0时,数据是对齐的。例如,WORD值应该总是从被2除尽的地址开始,而DWORD值应该总是从被4除尽的地址开始,如此等等。当CPU试图读取的数据值没有正确对齐时,CPU可以执行两种操作之一。即它可以产生一个异常条件,也可以执行多次对齐的内存访问来读取完整的未对齐数据值。x86微软Visual C/C++编译器不支持__unaligned关键字。

     

    进行内核调试时,通常只有一个进程的用户空间可见,此时所有用户空间地址和内容都属于该进程;要查看另一个进程的用户空间,就要将进程上下文切换到另一个进程。

     

    资源

    Custom postmortem debuggers on Vista

    Windows使用键盘生成内存转储文件

    Capturing Application Crash Dumps

    Getting Started with SVCHOST.EXE Troubleshooting

    What is a First Chance Exception?

    分享到:

    历史上的今天:

    Android 屏幕截图 2011年08月04日
    Faban 2009年08月04日