vs添加lol商店进程中断之后怎么中断

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
如何在VS2010中运行程序及调试
下载积分:1000
内容提示:如何在VS2010中运行程序及调试
文档格式:PDF|
浏览次数:31|
上传日期: 16:10:51|
文档星级:
该用户还上传了这些文档
如何在VS2010中运行程序及调试
官方公共微信VS中,如果想知道一个程序是怎么运行的,应该怎么加断点然后怎么运行着看?_百度知道
VS中,如果想知道一个程序是怎么运行的,应该怎么加断点然后怎么运行着看?
如果是窗口类应用程序在哪加呢
提问者采纳
在需要的行上点右键,选“插入断点”,然后点“启动”(F5)(方案要配置成Debug,一般默认就是),程序就会在运行到设置断点的地方停下来,然后点“逐过程”(F10),或“逐语句”(F11)
其他类似问题
为您推荐:
您可能关注的推广回答者:
断点的相关知识
其他5条回答
从你的程序入口处即 Main()方法处加断点,然后按F11一条一条语句的往下走,或者按F10是按过程往下走
F5 跳到下一断点F10 逐过程F11 逐语句
点一下代码框左边的空白区域(长的,窄的),就会在该行出现一个红色的点,那就是断点。
出错的原因是你有一个对象没有实例化,也就是没有使用关键字new一下(例如: TexBox TB1 = new TexBox(),再如:DataSet Ds1 = new DataSet()),如果你都new了,那么也有可能是你所new的对象不存在了,或者是在程序中不可用。给阁下一个找到出错原因的方法:
一、你如果是在编写程序过程中测试这个index.aspx页面时出现上述错误,那么你可以如下解决:
1、用VS.NET2003或VS.NET2005(主要看这个程序工程,你原来用的是哪一个开发环境了)打开此程序工程。
2、如果点击运行没有错误,及编译后没有产生语法错误,那么就要找到是在哪个功能的哪条语句中出现了上述错误。可在能执行的地方设置断点,逐句运行程序看到哪条语句后不能执行而提示了错误。
3、如果你已经new过了对象,那么你看看你new过的对象是否已...
参考资料:
bba127d3abb9d8b4
要测试的那段的前后各一个,或者直接设置监视
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Reference from :&
在软件开发周期中,测试和修正缺陷(defect,defect与bug的区别:Bug是缺陷的一种表现形式,而一个缺陷是可以引起多种Bug的)的时间远多于写代码的时间。通常,debug是指发现缺陷并改正的过程。修正缺陷紧随debug之后,或者说二者是相关的。如果代码中存在缺陷,我们首先要识别造成缺陷的根本原因(root cause),这个过程就称作调试(debugging)。找到根本原因后,就可以修正缺陷。
那么如何调试代码呢?Visual Studio提供了很多用于调试的工具。有时调试需要花费大量时间去识别root cause。VS提供了许多辅助调试的便捷的工具。调试器(Debugger)包含错误列表、添加断点、可视化的程序流程、控制执行流程、Data Tips、监视窗口(watch windows)、多线程调试、线程窗口、并行调试概览以及IntelliTrace调试概览。我希望本文能够对调试功能的使用者有所裨益。请注意,本文使用VS2010。某些功能在旧版本中也是一致的,但是VS2010新增了许多features(Labeling breakpoint, Pinned DataTip, Multithreaded Debugging, Parallel debugging and IntelliTrace)。
2 如何启动调试?
可以通过VS的调试(Debug)菜单启动调试。点击调试菜单下的&启动调试&或者按F5键启动。如果你已经在代码中加入了断点,那么执行会自动开始。
图 启动调试(Start Debugging)
&附加到进程(Attach to Process)&是另一种启动调试的方法。Attach Process会为应用程序启动一个调试会话。可能我们更熟悉ASP.NET Web应用的Attach Process调试。我发了另外两篇相关的帖子。如下:
通常我们通过在可能存在问题代码处加断点来启动调试。因此,我们从断点开始讲起。
3 断点(Breakpoints)
断点用于通知调试器何时何处暂停程序的执行。通过点击左边栏或者按F9键在当前行添加断点。在加断点之前,你需要知道你的代码将会出现什么错误,在什么地方停止执行。当调试器执行到断点处时,你可以使用其他的调试工具核对代码何处出现错误。
图 设置断点(Set Breakpoint)
3.1 使用断点进行调试
你已经在你想要暂停执行的地方设置了断点。现在按F5键启动调试,当程序执行到断点处时,自动暂停执行。此时你有多种方式来检查代码。命中断点(hit the breakpoint)后,加断点的行变为黄色,意指下一步将执行此行。
在中断模式下,你有多条可使用的命令,使用相应命令进行进一步的调试。
图 断点工具条(Breakpoint Toolbar)
3.1.1 逐过程(Step Over)
调试器执行到断点后,你可能需要一条一条的执行代码。&Step Over&[F10]命令用于一条一条的执行代码。这将执行当前高亮的行,然后暂停。如果在一条方法调用语句高亮时按F10,执行会停在调用语句的下一条语句上。Step Over会一次整个方法。
图: 逐过程(Step Over - F10)
3.1.2 逐语句(Step Into)
它与Step Over相似。唯一的不同是,如果当前高亮语句是方法调用,调试器会进入方法内部。快捷键是&F11&。
图: 逐语句(Step Into - F11)
3.1.3 跳出(Step Out)
当你在一个方法内部调试时会用到它。如果你在当前方法内按Shift - F11,调试器会完成此方法的执行,之后在调用此方法的语句的下一条语句处暂停。
3.1.4 继续(Continue)
它像是重新执行你的程序。它会继续程序的执行直到遇到下一个断点。快捷键是&F5&。
3.1.5 设置下一语句(Set Next Statement)
这是一个非常有趣的特性。设置下一语句允许你在调试的时候改变程序的执行路径。如果你的程序在某一行处暂停而且你想改变执行路径,跳到指定行,在这一行上右击,在右击菜单中选择&设置下一语句&。这样程序就会转到哪一行执行而不执行先前的代码。这在如下情况中非常有用:当你发现代码中某些行可能会导致程序的中断(break)而你不想让程序在那个时候中断。快捷键是Ctrl + Shift + F10。
图: 设置下一语句(Set Next Statement)
3.1.6 显示下一语句(Show Next Statement [Ctrl+*])
这一行用黄色箭头标记。这行是程序继续执行时下一条将执行的语句。
3.2 断点标签(Labeling in Break Point)
这是VS2010提供的新特征(feature)。用于更好的管理断点。它使得我们能够更好的分组和过滤断点。这像是对断点的归类。如果我们添加了与某一功能相关的不同类型的断点,我们可以根据需要使能(enable)、取消(disable)、过滤(filter)这些断点。例如,假设我们要调试一下代码块。
class&Program&&
&&&&&&&&static&void&Main(string[]&args)&&
&&&&&&&&{&&
&&&&&&&&&&&&string[]&strNames&=&{&"Name1",&"Name2",&"Name3",&"Name4",&"Name5",&"Name6"&};&&
&&&&&&&&&&&&foreach&(string&name&in&strNames)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&Console.WriteLine(name);&&&&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&int&temp&=&4;&&
&&&&&&&&&&&&for&(int&i&=&1;&i&&=&10;&i++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&if&(i&&&6)&&
&&&&&&&&&&&&&&&&&&&&temp&=&5;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&public&static&void&Method1()&&
&&&&&&&&{&&
&&&&&&&&&&&&Console.WriteLine("Break&Point&in&Method1");&&&&&
&&&&&&&&}&&
&&&&&&&&public&static&void&Method2()&&
&&&&&&&&{&&
&&&&&&&&&&&&Console.WriteLine("Break&Point&in&Method2");&&&&
&&&&&&&&&&&&Console.WriteLine("Break&Point&in&Method2");&&&&
&&&&&&&&}&&
&&&&&&&&public&static&void&Method3()&&
&&&&&&&&{&&
&&&&&&&&&&&&Console.WriteLine("Break&Point&in&Method3");&&&&
&&&&&&&&}&&
执行程序将停在第一个断点处。下图给出了断点列表。
图: 断点列表
上图中Labels列都为空。下面介绍如何给断点设置标签(label)以及如何使用标签。只需在特定代码行的断点符号上右击(①)或者在断点窗口中设置(②)即可对任何断点设置标签。
图: 设置断点标签(Setting Breakpoint Label)
右击断点,点击编辑标签(Edit Labels),即可对任意断点添加标签。对于示例代码,我为所有断点的标签起了易于理解的名字。
图: 添加断点标签(Adding Breakpoint Label)
这些标签如何辅助我们调试呢?现在,所有断点都是使能的(enabled)。如果你不想调试method2,一般情况下你必须去对应的方法中一个一个的取消断点,但这里你可以通过标签名过滤或者搜索它们,然后选中它们以方便的取消它们。
图: 使用标签过滤断点(Filter Breakpoint Using Labels)
断点标签到此介绍完毕。我举的例子非常简单,但是断点标签在你调试大量代码,多个工程等情况下非常有用。
3.3 条件断点(Conditional Breakpoint)
假设你在多次迭代(循环)处理数据而你只想调试其中某几次迭代。这意味着你想根据某些特定条件暂停你的程序。Visual Studio断点允许你设置条件断点。当且仅当条件满足时,调试器才会停住。
首先,你需要在你想暂停执行处设置断点。然后右击红色的断点图标。右键菜单中点击&条件&。
图: 设置断点条件(Set Breakpoint Condition)
点击右键菜单中的&条件&后,会弹出下面的对话框设置断点的条件。
图: 断点条件设置
假设你要调试下面的代码块:
class&Program&&
&&&&&&&&static&void&Main(string[]&args)&&
&&&&&&&&{&&
&&&&&&&&&string&[]&strNames&=&{&"Name1","Name2",&"Name3",&"Name4",&"Name5",&"Name6"};&&
&&&&&&&&&&&&foreach(string&name&in&strNames)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&Console.WriteLine(name);&&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
你在Console.WriteLine()语句处设置了断点。当执行程序时,每次for-each循环都会停住。如果你想让代码只在name="Name3"时停住,该怎么办呢?非常简单,你只需使用条件name.Equals("Name3")。
图: 设置断点条件
查看断点符号。它应该看上去像是一个加(+)号在断点符号内部,这表示该断点是条件断点。
图: 条件断点符号(Conditional Breakpoint Symbol)
设置断点的条件之后,在调试程序,调试器只会在满足给定条件时才停住。
图: 条件断点命中(Conditional Breakpoint hit)
条件输入框的自动补全(intellisense):上面给出的断点条件非常简单,可以非常容易的写到条件文本框中。有时你可能需要定义很大很复杂的条件。不必担心,VS为条件文本输入框也提供了自动补全功能。因此,在条件框中输入就像是在编辑器中一样方便。如下图。
图: 条件文本框的自动补全(intellisense in condition textbox)
我几乎讲解了条件断点的所有内容。除了下面这点。在条件窗口中有两个选项:
Has Changed
我们已经看到&Is True&选项的用途了。&Has Changed&用在当你想在某些值变为某些特定值的时候停住。
3.4 导入/导出断点(Import / Export Breakpoint)
3.5 断点命中计数(Breakpoint Hit Count)
3.6 Breakpoint When Hit
3.7 断点筛选器(Breakpoint Filter)
你可以限制断点只对特定进程或线程有效。这在进行多线程程序的调试时非常有用。右击断点选&筛选器&即可打开筛选器窗口。
图: 断点筛选器(Breakpoint Filter)
在筛选规则中,你可以设置进程名,进程Id,机器名,线程ID等。我会在多线程调试小节中详述其用法。
4 数据便签(Data Tip)
数据便签是应用程序调试期间用于查看对象和变量的一种高级便签消息。当调试器执行到断点时,将鼠标移到对象或者变量上方时,你会看到它们的当前值。你甚至可以看到一些复杂对象(如dataset,datatable等等)的细节。数据便签左上角有一个&+&号用于展开它的子对象或者值。
图: 调试时的数据便签(DataTips During Debugging)
几个月前,我发过一篇关于的文章。
下面是一些在调试时有用的特性。
4.1 Pin Inspect Value During Debugging
4.2 Drag-Drop Pin Data Tip
4.3 Adding Comments
4.4 Last Session Debugging Value
4.5 Import Export Data Tips
4.6 Change Value Using Data Tips
4.7 Clear Data Tips
5 监视窗口(Watch Windows)
5.1 局部变量(Locals)
列出当前方法中的所有变量。当调试器停在某特定断点并打开Autos窗口时,将展示当前范围中与此值相关的变量。
图:Local Variables
5.2 自动窗口(Autos)
这些变量由VS调试器在调试的时候自动检测。VS检测与当前语句相关的对象或变量,基于此列出Autos变量。Autos Variable的快捷键是Ctrl + D + A。
图:Autos - Ctrl + D, A
5.3 监视(Watch)
Watch窗口用于添加变量。你可以添加任意多个变量。添加方法是,右击变量并选择&Add to Watch&。
图:Watch - Ctrl + D, W
也可以使用拖放(Drag and Drop)将变量添加到监视窗口中。从监视窗口中删除变量的方法是,右击变量并选择&Delete Watch&。通过调试窗口,也可以在运行时编辑这些变量值。
有4个可同时使用的监视窗口。图:多个监视窗口
若果变量中含有对象实例,左边会有一个&+&号用于查看对象的属性和成员。
图:展开监视变量
5.3.1 Creating Object ID
Visual Studio调试器提供另外一个强大的功能,支持我们为对象的任何一个特定实例创建一个对象ID(object ID)。这可以用于在任何时间监控任意对象,甚至是该对象位于范围(scope)之外。在监视窗口(watch window)右击特定对象变量,再单击&Make Object ID&即可创建Object ID。
图: 创建Object ID
在对特定对象变量创建Object ID之后,Visual Studio会给这个对象添加一个数码和&#&号,用来表示。
图:添加Object ID后
6 即时窗口(Immediate Window)
即时窗口是开发人员常用的功能。它可以在不改变当前调试步骤的情况下修改变量值或者执行一些语句。我们可以通过菜单调试 & 窗口 & 即时(Debug & Window & Immediate Window)打开即时窗口。即时窗口支持一组命令,可在调试的任何时刻执行。它也支持Intellisense。在调试期间,我们可以在即时窗口中执行任何命令或者代码语句。
图:基本即时窗口(Basic Immediate Window)
这是对所有开发人员来说最为常用的特性,因此我就不一一介绍即时窗口的每一条命令了。
7 调用堆栈(Call Stack)
8 调试多线程程序(Debugging Multithreaded Program)
8.1 Exploring Threads Window
8.2 Flag Just My Code
8.3 Break Point Filter - Multithread Debugging
9 调试并行程序(Debugging Parallel Program)
9.1 Parallel Task and Parallel Stacks
10 Debugging with IntelliTrace
10.1 Overview
10.2 Mapping with IntelliTrace
10.3 Filter IntelliTrace Data
11 调试常用快捷键(Useful Shortcut Keys For VS Debugging)
Shortcut Keys
Descriptions
Ctrl-Alt-V, A
Displays the Auto window
Ctrl-Alt-B
Displays the Breakpoints dialog
Ctrl-Alt-C
Displays the Call Stack
Ctrl-Shift-F9
Clears all of the breakpoints in the project
Enables or disables the breakpoint on the current line of code
Ctrl-Alt-E
Displays the Exceptions dialog
Ctrl-Alt-I
Displays the Immediate window
Ctrl-Alt-V, L
Displays the Locals window
Ctrl-Alt-Q
Displays the Quick Watch dialog
Ctrl-Shift-F5
Terminates the current debugging session, rebuilds if necessary, and starts a new debugging session.
Starts or resumes execution of your code and then halts execution when it reaches the selected statement.
Ctrl-Shift-F10
Sets the execution point to the line of code you choose
Highlights the next statement
If not currently debugging, this runs the startup project or projects and attaches the debugger.
Runs the code without invoking the debugger
Executes the remaining lines out from procedure
Executes the next line of code but does not step into any function calls
Available in break and run modes, this terminates the debugging session
Ctrl-Alt-H
Displays the Threads window to view all of the threads for the current process
Sets or removes a breakpoint at the current line
Ctrl-Alt-W, 1
Displays the Watch 1 window to view the values of variables or watch expressions
Ctrl-Alt-P
Displays the Processes dialog, which allows you to attach or detach the debugger to one or more running processes
IntelliTrace Event
到此本文结束。希望你喜欢本文。请分享你的反馈和建议。
12 深入学习(Further Study)
13 总结(Summary)
本文介绍了调试过程的基本内容。介绍了如何使用VS调试一个应用程序。我解释了几乎所有重要的工具以及它们的使用方法。对于并行程序调试,我只讲了基础部分。在深入学习小节中,深入讲解了并行调试过程。如果你感兴趣,请阅读。我的主要目的是涵盖Visual Studio中提供的几乎所有调试工具。希望你从本文中学到了一些新知识。
&自动窗口&(Autos):当前使用的变量
&局部窗口&(Locals):在范围内的所有变量
&监视N&(Watch):可定制(N从1到4)
Step Into(逐语句):执行并移动到下一条语句(实际上,跳入上一条语句的代码块,此代码块的第一条)
Step Over(逐过程):执行并跳到下一条语句,但不进入上一条语句的代码块
Step Out(跳出):执行到代码块结尾
命令窗口(Command)
即时窗口(Immediate):主要用于计算表达式
参考资料:
阅读(...) 评论()内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间。它们代表不同的级别,而对系统资源具有不同的访问权限。内核模块运行在最高级别(内核态),这个级下所有的操作都受系统信任,而应用程序运行在较低级别(用户态)。在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自己的地址空间。
处理器总处于以下状态中的一种:
1、内核态,运行于进程上下文,内核代表进程运行于内核空间;
2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
3、用户态,运行于用户空间。
用户空间的应用程序,通过系统调用,进入内核空间。由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的地址映射,通用或专用的寄存器组,而用户空间的进程要传递很多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续执行。
所谓的&进程上下文&,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。
所谓的&中断上下文&,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被中断的进程环境)。
当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。
Linux内核工作在进程上下文或者中断上下文。提供系统调用服务的内核代码代表发起系统调用的应用程序运行在进程上下文;另一方面,中断处理程序,异步运行在中断上下文。中断上下文和特定进程无关。
上下文context:上下文简单说来就是一个环境,相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。&&&&&& 一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。&&&&&& 用户级上下文: 正文、数据、用户堆栈以及共享存储区;&&&&&& 寄存器上下文: 通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);&&&&&& 系统级上下文: 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。
&&&&&& 当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行。而系统调用进行的是模式切换(mode switch)。模式切换与进程切换比较起来,容易很多,而且节省时间,因为模式切换最主要的任务只是切换进程寄存器上下文的切换。
进程上下文主要是异常处理程序和内核线程。内核之所以进入进程上下文是因为进程自身的一些工作需要在内核中做。例如,系统调用是为当前进程服务的,异常通常是处理进程导致的错误状态等。所以在进程上下文中引用current是有意义的。内核进入中断上下文是因为中断信号而导致的中断处理或软中断。而中断信号的发生是随机的,中断处理程序及软中断并不能事先预测发生中断时当前运行的是哪个进程,所以在中断上下文中引用current是可以的,但没有意义。事实上,对于A进程希望等待的中断信号,可能在B进程执行期间发生。例如,A进程启动写磁盘操作,A进程睡眠后B进程在运行,当磁盘写完后磁盘中断信号打断的是B进程,在中断处理时会唤醒A进程。
内核可以处于两种上下文:进程上下文和中断上下文。在系统调用之后,用户应用程序进入内核空间,此后内核空间针对用户空间相应进程的代表就运行于进程上下文。异步发生的中断会引发中断处理程序被调用,中断处理程序就运行于中断上下文。中断上下文和进程上下文不可能同时发生。
  运行于进程上下文的内核代码是可抢占的,但中断上下文则会一直运行至结束,不会被抢占。因此,内核会限制中断上下文的工作,不允许其执行如下操作:
  (1) 进入睡眠状态或主动放弃CPU;
由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context)。
  (2) 占用互斥体;
为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock。
  (3) 执行耗时的任务;
中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理。
  (4) 访问用户空间虚拟内存。
因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在中断上下文无法访问用户空间的虚拟地址
&  (5) 中断处理例程不应该设置成reentrant(可被并行或递归调用的例程)。
因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的。
  (6)中断处理例程可以被更高级别的IRQ中断。
如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。
阅读(...) 评论()16460人阅读
许多Visual Studio下的程序员,甚至一些很有经验的开发人员,都不知道这些技巧。希望这篇文章能帮你掌握这些技巧。它们都很简单,却能帮你节约大量的时间。
一、跳到当前光标处(Ctrl+F10)
我经常看到人们为了到达目标代码位置,而在程序中早早设定了断点,然后反复地按F10/F11,一步步走到目标代码处。当程序员的确需要仔细观察每一步的状态变化时, F10/F11是合理的选择。然而多数情况下,人们只想快速到达他们真正关心的代码处,这时候F10/F11就不是最佳选择了。
这时,你应该利用“跳到当前光标处”这个功能。先把光标定位在要测的目标代码行上,再同时按Ctrl和F10,被测程序将直接跳到该行停下。你再也不用按许多次F10/F11了。即使目标代码位于独立的类或方法中,你仍然可以从当前正在检查的地方跳过去。
二、条件中断
另一种常见的情况是:开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。
针对上述情况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。
如何设置条件断点
设置条件断点非常容易。在特定的行上,按F9设置断点。
然后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“Condition…”。
这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当局部变量paginatedDinners的尺寸小于10时,调试才中断。我们可以写出如下的表达式:
现在我再运行这个程序,实现搜索,只有返回值小于10时,程序运行才会被中断。对于大于10的值,该断点将被跳过。
三、记录到达断点次数
有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第五次返回少于10份晚餐的查询结果时,中断程序运行。
可以通过右击断点,然后在弹出菜单上选择“Hit count…”菜单命令实现。
这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。
四、机器/线程/进程过滤
设置如下:右击断点;在弹出菜单上选择“Filter…”菜单命令;然后指定命中断点的特定条件:在指定的机器上、或指定的进程中、或指定的线程中。
跟踪点—进入断点时的自定义操作
许多人不知道“跟踪点(TrackPoints)”这个调试功能。“跟踪点“是种特殊的断点,当它被命中时,它会触发一系列自定义操作。如果你想观察程序的行为,而又不想中断调试的时候,这个功能尤其有用。
我将用一个简单的控制台程序来演示如何使用“跟踪点”。如下是Fibonacci数列的一个递归实现:
以上程序中,我们使用Console.WriteLine() 输出针对特定输入值生成的最终斐波那契数列。如果希望在调试器里观察操作中每一次递归运算后的数列而又不实际中断程序运行,该怎么办呢?“跟踪点”可以轻松实现。
设置跟踪点
你可以在特定的行上,按F9加跟踪点。然后
右击断点,在上下文菜单中选择“When Hit…”:
在弹出对话框上,你可以设置命中该断点时,所触发的事件。
在上面例子中,我们设定一旦命中断点时就打印追踪信息。注意,我们已经把局部变量“x”的值,作为追踪信息的一部分输出。局部变量可以通过{变量名}语法输出。你还可以利用系统内置的命令($CALLER, $CALLSTACK, $FUNCTION等等),在追踪信息中输出常用的调试值。
在上例中,我们同时选中了底端的“continue execution“选项,这说明我们不希望程序中断调试状态,而是继续运行。唯一的不同是:每次断点条件满足时,我们的自定义追踪信息都将被输出。
现在当我们运行程序时,会发现自定义追踪信息自动显示在Visual Studio的“输出“窗口里。这让我们很容易看到程序的递归调用过程:
你也可以选择往应用程序中添加一个自定义追踪信息的监听器。这时追踪点的输出信息将通过它输出,而不是Visual Studio的“输出“窗口。
五、跟踪点—运行自定义的宏
当命中跟踪点时,能否自动输出所有的局部变量?
Visual Studio中并没有这样的内置功能,但我们可以写一个自定义宏来实现,然后在命中跟踪点时调用该宏。这个的实现需要先打开Visual Studio的宏编辑器(工具-&宏-&宏IDE菜单命令),然后在项目资源管理器的MyMacros节点下选择一个模块或创建新模块(如:加个名为“UsefulThings”的模块),再把下面的VB宏代码贴到模块中并保存。
Sub DumpLocals()
Dim outputWindow As EnvDTE.OutputWindow
outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
Dim currentStackFrame As EnvDTE.StackFrame
currentStackFrame = DTE.Debugger.CurrentStackFrame
outputWindow.ActivePane.OutputString(“*Dumping Local Variables*” + vbCrLf)
For Each exp As EnvDTE.Expression In currentStackFrame.Locals
outputWindow.ActivePane.OutputString(exp.Name + ” = ” + exp.Value.ToString() + vbCrLf)
上述宏代码将循环当前的堆栈,把所有的局部变量输出到“输出”窗口。
使用自定义的“DumpLocals”宏
然后,我们可以在如下的一个简单程序中使用刚定制的“DumpLocals”宏了:
上述代码中,我们用F9在“Add”方法的返回值处加了个断点,然后右击断点,在弹出菜单上选择“When hit”。
将显示如下对话框。和之前不一样, 我们不选“Print a message”选项,也不手工设定需要输出的变量;而是选择“Run a marco”复选框,并指定到我们上面创建的UsefulThings.DumpLocals宏上:
为了使程序能在命中跟踪点后仍继续运行,我们将继续选中“continue execution”复选框。
现在按F5运行程序,当“Add”方法被调用时,我们会在Visual Studio的“输出”窗口中看到如下结果。注意命中跟踪点时,宏会自动列出每个局部变量的名称和值:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:500706次
积分:7408
积分:7408
排名:第1306名
原创:213篇
转载:48篇
评论:174条
文章:20篇
阅读:59579
文章:23篇
阅读:34282
文章:20篇
阅读:32819
(2)(1)(3)(3)(2)(2)(6)(8)(1)(14)(5)(2)(5)(3)(9)(8)(10)(8)(4)(10)(17)(8)(9)(1)(8)(8)(9)(8)(9)(5)(5)(4)(20)(13)(14)(16)(1)}

我要回帖

更多关于 英雄联盟进程中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信