博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Visual Studio调试之断点基础篇
阅读量:5124 次
发布时间:2019-06-13

本文共 1624 字,大约阅读时间需要 5 分钟。

原文链接地址:

我曾经问过很多人,你一般是怎么调试你的程序的?

F9, F5, F11, F……

有很多书和文章都是介绍怎么使用Visual Studio编写WinForm啦,、ASP.NET之类的程序;知道如何编写固然重要,但是我觉得程序员可能只会花费30%的时间在编写代码上,剩下的大部分时间都是在调试程序。在网上看到很多人介绍Windbg的用法,但是没有看到几篇讲解使用Visual Studio调试的文章。Windbg固然强大,但是问题是它的学习曲线太陡了,而且很多调试并不需要使用Windbg来调试(当然啦,并不是指我不会Windbg调试啦—这是以后的调试系列文章将要讲的),为什么不使用我们最熟悉的Visual Studio来进行调试呢?

调试嘛,无非就是要看看程序在运行时候,内部的状态,例如一些变量的值是多少,看一看程序调用的路径啦之类的。当然最直接的方式就是直接中断程序的执行,用调试器去检查一下程序的情况嘛。于是F9, F5, F10, F11……

那么我们就来说说什么是断点,断点是什么?不是F9 ,也不是那个小红球,在Intel系列的CPU(包括AMD生产的CPU)里面,它其实是一个特殊的指令—INT 3。CPU在执行程序的指令集的时候,只要碰到这个指令,就会中断程序的执行(当然啦,CPU会通知操作系统,然后……然后……然后……,断点的实现机制我会在以后的文章里面讲解,现在我们就只要知道那个INT 3指令会中断程序的执行好吗?)。

当然啦,我们需要用事实来证明我上面的话,因此把下面的程序编译并且执行一下,点“Yes”,点“Break”,对对对,程序中断了,我相信你可以看见的:

#include 
void main(){ printf("Before breakpoint"n");__asm {int 3 } printf("Before breakpoint"n");}

 

编译方法:

1. 在开始菜单中打开Visual Studio 2008[2005] Command Prompt(Visual Studio 2008[2005]命令行)。

2. 进入保存上面 C源代码(int3.c)的文件夹的路径。

3. 执行编译命令(因为我的机器是Windows 7 RC + Visual Studio 2008 + x64 CPU,直接编译有一点问题,如果你的机器不是我上面的配置,可以尝试执行cl /Zi int3.c

cl /Zi /c int3.c

4. 执行链接命令(如果你直接执行了命令cl /Zi int3.c的话就可以跳过这一步)。

link /libpath:"C:"Program Files"Microsoft SDKs"Windows"v6.0A"Lib" int3.obj

5. 运行输出的int3.exe。

这时你应该会看到Visual Studio弹出来,然后在源代码行的int 3上面中断,说明我们已经成功地让CPU中断int3.exe程序 的执行了。

提示:如果你执行int3.exe的时候,没有发现Visual Studio窗口弹出来的话,那么请点击Visual Studio菜单项里面的“Tools(工具)”—“Options(选项)”,接着在“Options(选项)”窗口中选择“Debugging(调试)”—“Just-In-Time(即时调试)”,然后勾选“Native(原生程序)”选项。如下图所示:

“综上所述,断点是int 3这个指令触发的!(小时候的数学证明题)”。

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

未完待续……

转载于:https://www.cnblogs.com/wuyuan2011woaini/p/5176828.html

你可能感兴趣的文章
MySQL-5.7.21非图形化下载、安装、连接问题记录
查看>>
RabbitMQ 声明Queue时的参数们的Power
查看>>
中国经济怎么办之我见
查看>>
什么是REST API?
查看>>
目标检测近5年发展历程概述(转)
查看>>
14. Java基础之泛型
查看>>
spring----06 更多DI知识
查看>>
FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息
查看>>
OSGI(面向Java的动态模型系统)
查看>>
精通 ASP.NET MVC 4 学习笔记(一)
查看>>
laravel框架的数据库链接
查看>>
Unity预计算全局实时GI(gi params)
查看>>
Unknown column 'user_uid' in 'field list' sql错误解决过程
查看>>
约瑟夫问题(Josephus Problem)的两种快速递归算法
查看>>
ajax小结
查看>>
Linux 内核编码风格【转】
查看>>
炎炎夏日需要一个清凉的地 - 自制水冷系统(十一 指尖的思绪之程序篇)
查看>>
所有选择器
查看>>
day10 Pyhton学习
查看>>
c# 路径空格---ProcessStartInfo参数问题
查看>>