zoukankan      html  css  js  c++  java
  • Attach Debugger

    1. Native 程序

    程序崩溃时,windows系统会调用系统默认调试器,其设置在注册表
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
    (注:64位windows的上的路径不同,在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\)
    这里面有2个主要的值:

    Auto
    = 0 的时候,系统会弹出一个对话框,让你在几个调试器中选择(如果你的系统安装了多个调试器的话)
    = 1 的时候,系统会自动调用默认调试器

    Debugger
      默认调试器的路径。
      比如windows自带的Dr.Watson : DRWTSN32 -p %ld -e %ld –g 
      Visual Studio JIT debugger: "C:\Windows\system32\vsjitdebugger.exe" -p %ld -e %ld 
      或者是WinDBG: windbg.exe" -p %ld -e %ld –g   
    Tip:
    如果想把windbg设置成默认调试器,可以运行windbg.exe -I 命令,windbg会自动完成设置。

    -p和-e是调试器的一些命令行参数,而%ld则是一个占位符,Windows会把死亡的进程的PID替换%ld这个值(读者如果熟悉批处理编程的话,就应该知道%ld实际上是批处理程序的参数的声明方式)。
    vsjitdebugger.exe是Visual Studio用来处理验尸调试的调试器名称,如果你安装了Visual Studio,VS的安装程序应该会自动为你设置好这个键。
    Auto:如果值是1的话,那么windows就会自动在进程死亡的时候,启动调试器;如果为0的话,就会打开一个对话框问你是否要执行验尸调试—但是Windows 7如果是这个选项的话,会直接禁用验尸调试,因此我推荐将Auto的值总是设置成1。

    Test.cpp

    #include "stdafx.h"

    int _tmain(int argc, _TCHAR* argv[])
    {
         int *p = NULL;
         // 触发一个异常
         *p = 0;
        return 0;
    }

    cl.exe /Zi test.cpp


    image 

    2. 托管程序

    上面的设置仅对native程序有效,如果要设置托管程序的默认验尸调试器,在""HKEY_LOCAL_MACHINE"Software"Microsoft".NETFramework里面,分别创建下面两个键:
    DbgManagedDebugger   REG_SZ "C:"Windows"system32"vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d
    DbgJITDebugLaunchSetting  REG_DWORD  2
    使用上面的设置,你应该可以做所有非Winform托管程序的验尸调试了。
    3. Winform程序

    当你的Win form程序崩溃(Crash)的时候,你会发现你设置的默认验尸调试器没有运行起来,原因是因为Win form程序默认禁用了即时调试(JIT Debug)的功能。因此要设置Win form程序的默认验尸调试器,你除了做上面的步骤以外,你还要将Win form程序的即时调试功能打开。打开的方法:

    a. 修改你机器的machine.config文件,这样机器上所有的Win form程序都会将这个即时调试功能打开。在<configuration>里面添加下面一行:
    <system.windows.forms jitDebugging="true" />

    b. 修改单独程序的的app.config文件打开单个Win form程序的即时调试功能。在<configuration>里面添加下面一行:
    <system.windows.forms jitDebugging="true" />

    例如:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.windows.forms jitDebugging="true" />
    </configuration>

    Image File Execution Options

    如果要调试的进程,也就是debuggee,is spawn by another process, 要用到"Image File Execution Options" technique to automatically attach it to windbg when it's started.

    1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options"
    2. 新建一个键(Key),键名就是你要调试的程序的文件名,例如notepad.exe
    3. 然后在这个新建的键值(Key)下,新建一个字符串值(String Value)Debugger,值设置为你喜欢的调试器:
         a. 如果选择Visual Studio的话,就是C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe
         b. 选择Windbg的话,就是c:\debuggers\windbg.exe
    设置好了以后,启动notepad.exe,这个时候你选择的调试器就会被Windows先启动起来,然后在notepad.exe的入口处中断。


    作者:Angelo Lee
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    所遇bug
    PHP后端读取文件给video标签返回视频地址
    element-ui 上传组件 自定义上传没有进度条解决方法
    PHP递归生成分类树
    Vue.js学习 — 微信公众号菜单编辑器(二)
    Vue.js学习 — 微信公众号菜单编辑器(一)
    swiper3插件无缝滚动配置
    PHP获取一周的日期
    bootstrap-select多选下拉列表插件使用小记
    html5小总结
  • 原文地址:https://www.cnblogs.com/yefengmeander/p/2887659.html
Copyright © 2011-2022 走看看