1,断点设置有技巧:
1)设置条件断点,比如i==10,变量改变时断点;
2)如何让断点在指定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择Hit Count;
3)When Hit,这个选项可以让我们在命中断点后做一些事情,包括输出一些内容,或者调用宏,比如输出一个程序中变量的值;
4)利用断点的Filter功能,比如我希望断点只有被机器名为yizhu的机器访问才能触发;
具体参见:一篇介绍VS2005调试断点技巧的文章
2. 怎样判断加载的dll的正确性?
调试时,打开Debug->Window->Modules,在窗口中显示的就是当前进程加载的所有dll及其详细信息,如果
断点无法击中,可以检查这里,看是否有匹配的pdb文件或者是加载了错误的dll
3. 已经开始调试的工程加入另外的进程并且调试
如果你在调试客户端,但是服务器需要调试,那么使用菜单中的Tools-> Attach to process进行进程挂接,这种方法可以挂接所有windows下的程序,能否调试,就看其是否调试版和有调试用的PDB文件
4. 同时启动多进程进行调试
在Solution的属性中的Common Properties->Startup Project。选择Multiple startup projects。这个选项是可以记忆的,下次打开可以直接调试,非常方便
5.调试Windows Service
MSDN推荐的方法
1、调试windows服务的初始化、启动
另写一个程序控制服务的初始化和启动
注意:OnStart里写Log, OnStart里要在30秒返回. 不然启动就失败了! 所以OnStart里不要放太多代码! 可以用异步或线程.
2、调试windows服务的其他方面
1 ) 安装您的服务 : intallutils xx.exe
2) 可从“服务控制管理器”、“服务器资源管理器”或代码启动服务
3) vs: 设置相关断点,启动调试,再在工具栏中选择 调试->附加到进程..., 选择您的服务, 确定。
3、trace方法
1)添加调试方法
private static void DebugRun(string[] args)
2)改写程序入口为如下:
public static void Main(string[] args)
{
#if DEBUG
DebugRun(args);
#else
/*
初始化服务
*/
#endif
}
3)加入2种调试代码
EventLog.WriteEntry("...");
System.Diagnostics.Debug.WriteLine("...");
6,远程调试技术
顾名思义,就是要调试的程序和调试器本身并不在一台机器上。由于虚拟机技术的盛行,在虚拟机里面运行待调试的程序,而在外面运行调试器,也是一种比较流行的做法。
1 为什么使用远程调试
远程调试有如下好处:
a. 能让产品运行在一个比较干净的环境。有的时候如果产品安装在一个装好集成环境的机器上,某些bug并不能显示出来。
b. 易于部署调试环境。很多产品都非常复杂,比如很多都以service方式运行或者要load很复杂的resource,想在调试器里面直接按F5运行,越来越难。
c. 对于游戏等全屏方式运行的程序,尤其有用。以前我对调试directx程序非常头疼。
2 怎样使用远程调试
使用vs2005进行远程调试,详细的介绍参考:http://support.microsoft.com/kb/910448
简单的来说,
1)在被调试的机器上面运行Msvsmon.exe
2)在调试机器上面运行vs2005,并attach到远程机器的某个进程
3 注意事项
a. 设置好正确的权限
被调试机器和调试机器需要互相信任的权限(two-way)。如果两台机器在同一个workgroup,让两台机器拥有一个相同的账号和密码,然后以这个账号运行。如果两台机器在一个域里面,比较简单,Msvsmon可以设置权限。如果一台机器在domain里面,另外一台不在,同样是让两台机器拥有一个相同的账号和密码,然后以这个账号运行。
对于Windows XP要特别注意一下,设置匿名的访问权限才可以work , http://support.microsoft.com/kb/908099
b.设置好symbol
什么,你不知道什么是symbol?简单的来说,symbol file(*.pdb) is for source-level debugging. VS2005就是靠它来调试exe的。默认情况下debug版本生成的,而release版本不生成pdb.设置好 [Project proerties]-[C/C++]-[Debug Information Format]-Program Database就可以了。
为了减少symbol方面的麻烦,最简单的做法是让被调试机器上的binary版本和本地compile出来保持一致。