zoukankan      html  css  js  c++  java
  • 即时调试(JustintimeDebugging) Visual Studio调试 断点中断程序的执行(断点指令)

        VC中的Just-in-time调试,使用该调试模式应用程序可以再Visual C++开发环境之外运行知道发生一个错误.当遇到一个程序错误时,Just-in-time调试自动加载Visual C++ Debugger   .要打开Just-in-time调试只需要修改Tools->Options->Just-in-time debugging选项即可(其实该选项所做的操作就是写了个注册表,将自己作为其他程序抛出异常时的处理程序,下面有介绍)

        设置即时调试断点,在编译生成的Debug版本程序中加入断点异常,在代码中硬编码一个断点(相当于让程序出错),让程序在到达程序员希望停止位置时加载已经打开源码的Debugger实现对该位置的调试. (当然没有源码也可以调试的,:-).如果想调试汇编的话.)

        VC中的即时调试断点设置方法:DbgBreakPoint 或者 DebugBreak

        C#中的即时调试断点设置方法:Debugger.Break

        JS中的即时调试断点设置方法:Debugger

        ASP(VBS)中的即时调试断点设置方法:Stop

    Visual Studio调试 断点中断程序的执行(断点指令)

    断点指令
        那么我们就来说说什么是断点,断点是什么?不是F9 ,也不是那个小红球,在Intel系列的CPU(包括AMD生产的CPU)里面,它其实是一个特殊的指令—INT 3。CPU在执行程序的指令集的时候,只要碰到这个指令,就会中断程序的执行。

    引用的示例
        当然我们需要用事实来证明我上面的话,因此把下面的程序编译并且执行一下,点“Yes”,点“Break”,程序就中断了.
    以下为引用内容:
    #include <stdio.h>
    void main()
    {
       printf("Before breakpoint"n");
       __asm
       {
         int 3
       }

       printf("Before breakpoint"n");
    }

    断点是int 3这个指令触发的。

    由int 3这个指令(当然是在intel系列的CPU上面)引申出来的函数 :

    语言/工具 名称    描述
    C++ DebugBreak 在C++代码中硬编码一个断点。
    C# Debugger.Break 在.NET代码中硬编码一个断点
    Visual Studio 断点 设置一个断点

    摘抄:

        随时将调试程序连接到任何进程的能力称为即时调试(Just-in-timeDebugging)。

        这里我们对它如何工作稍加说明:当程序员点击Cancel按钮,就是告诉UnhandledExceptionFilter函数对进程进行调试。在内部,UnhandledExceptionFilter调用调试程序,这需要查看下面的注册表子关键字:
            HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
        在这个子关键字里,有一个名为Debugger的数值,在安装VisualStudio时被设置成下面的值:
            "C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe" -p %ld -e %ld
        Windows98在Windows98中,这些值不是存放在注册表中,而是存放在Win.ini文件中。
    这 一行代码是告诉系统要将哪一个程序(这里是MSDev.exe)作为调试程序运行。当然也可以选择其他调试程序。 UnhandledExceptionFilter还在这个命令行中向调试程序传递两个参数。第一个参数是被调试进程的ID。第二个参数规定一个可继承的 手工复位事件,这个事件是由UnhandledExceptionFilter按无信号状态建立的。厂商必须实现他们的调试程序,这样才能认识指定进程 ID和事件句柄的-p和-e选项。
    在进程ID和事件句柄都合并到这个串中之后,UnhandledExceptionFilter通过调用 CreateProcess来执行调试程序。这时,调试程序进程开始运行并检查它的命令行参数。如果存在-p选项,调试程序取得进程ID,并通过调用 DebugActiveProcess将自身挂接在该进程上。
    BOOL DebugActiveProcess(DWORD dwProcessID);
         一旦调试程序完成自身的挂接,操作系统将被调试者(debuggee)的状态通报给调试程序。
         在 调试程序完全初始化之后,它要再检查它的命令行,找-e选项。如果该选项存在,调试程序取得相应的事件句柄并调用SetEvent。调试程序可以直接使用 事件的句柄值,因为事件句柄具有创建的可继承性,并且被调试进程对UnhandledExceptionFilter函数的调用也使调试程序进程成为一个 子进程。
          设定这个事件将唤醒被调试进程的线程。被唤醒的线程将有关未处理异常的信息传递给调试程序。调试程序接收这些通知并加载相应的源代码文件,再将自身放在引发异常的指令位置上。
         还 有,不必在调试进程之前等待异常的出现。可以随时将一个调试程序连接在任何进程上,只需运行“MSDEV-pPID”,其中PID是要调试的进程的ID。 实际上,利用Windows2000 TaskManager,做这些事很容易。当观察Process标记栏时,可以选择一个进程,点击鼠标右键,并选择Debug菜单选项。这将引起 TaskManager去查看前面讨论过的注册表子关键字,调用CreateProcess,并传递所选定的进程的ID作为参数。在这 里,TaskManager为事件句柄传送0值。

  • 相关阅读:
    浅复制(Shallow Copy)与深复制(Deep Copy)
    使Web API支持二级实体操作,兼对RESTFul风格API设计的疑惑。
    ActionResult
    如何在github上fork一个项目来贡献代码以及同步原作者的修改
    实用技巧:Google 搜索打不开的解决方法
    C# 汉字转拼音
    Windows Server AppFabric的安装、配置与问题排除
    小工具,大智慧(一)                     ——notepad++
    通用软件注册功能之建立有效的软件保护机制
    Javascript MVVM模式前端框架—Knockout 2.1.0系列:目录
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994735.html
Copyright © 2011-2022 走看看