VS调试功能的定制
时间:2010-03-14 来源:tyc611
VS提供了一些方法,可用来对一些调试行为进行定制。比如,可以指定调试过程中F11不需要进入的函数,可以控制指定类型在Watch窗口中的显示,等等。
在VS中,可以通过NoStepInto特性来指定某些函数在调试过程中永远不会进入(即使F11)。这个功能有时是相当有用的,特别是在调用函数时的某些参数本身又需要调用其它函数时,而这些“其它函数”可能正好是我们不愿意进入的。虽然,可以通过设定断点与F5配合,但这仅是一个workaround,用起来总是不爽。而NoStepInto特性正是我们想要的。但遗憾的是,NoStepInto特性并不是公开的,并且在各个版本中的设置方法也不尽相同。比如,
在VC6中,是在AutoExp.dat文件中进行设置。例如:
在VS中,可以通过NoStepInto特性来指定某些函数在调试过程中永远不会进入(即使F11)。这个功能有时是相当有用的,特别是在调用函数时的某些参数本身又需要调用其它函数时,而这些“其它函数”可能正好是我们不愿意进入的。虽然,可以通过设定断点与F5配合,但这仅是一个workaround,用起来总是不爽。而NoStepInto特性正是我们想要的。但遗憾的是,NoStepInto特性并不是公开的,并且在各个版本中的设置方法也不尽相同。比如,
在VC6中,是在AutoExp.dat文件中进行设置。例如:
[ExecutionControl]
string::.*=NoStepIno
MyFuc=NoStepInto
MyClass::OneSpecialMethod=StepInto
MyClass::.*=NoStepIno
MyTemplate<.*>::.*=NoStepInto
(注意,匹配任意字符串是用“.*”两个字符!!!)
而在VS7和VS7.1中,在注册表中设置:
string::.*=NoStepIno
MyFuc=NoStepInto
MyClass::OneSpecialMethod=StepInto
MyClass::.*=NoStepIno
MyTemplate<.*>::.*=NoStepInto
(注意,匹配任意字符串是用“.*”两个字符!!!)
而在VS7和VS7.1中,在注册表中设置:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.0\NativeDE\StepOver
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\NativeDE\StepOver
其中的,键NativeDE和键StepOver需要自己创建。并且,在注册表中某些字符需要进行转义。例如:
在VS8和VS9中,同样在注册表中设置,但位置有了变化:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\NativeDE\StepOver
其中的,键NativeDE和键StepOver需要自己创建。并且,在注册表中某些字符需要进行转义。例如:
名称 |
类型 |
值 |
20 | REG_SZ | MyClass\<.*\>\:\:OneSpecialMethod=StepInto |
10 |
REG_SZ |
MyClass\<.*\>\:\:.*=NoStepInto |
在VS8和VS9中,同样在注册表中设置,但位置有了变化:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VCExpress\8.0\NativeDE\StepOver
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VCExpress\9.0\NativeDE\StepOver
(非Express版,请把VCExpress替换为VisualStudio)
这个特性除了未被公开,在各个版本中设置方法不尽相同之外,还有一个更糟糕的地方,那就是在attach进程时并不会去扫描注册表的这些设置,所以此时这个特性将毫无意义。
Ref:
英文原版:http://blogs.msdn.com/andypennell/archive/2004/02/06/69004.aspx
一个中文版:http://www.cppprog.com/2008/1224/9.html
在VS中,为了调试方便,我们需要为自己的类型定制在Watch窗口中的显示,也就是定制这些类型在Watch窗口中的表达式计算结果。对于VS的不同版本,其方法不尽相同,但都需要用到AutoExp.dat文件。但由于这是一个官方支持的特性,所以我们可以大胆地使用.
(1)AutoExp方法
这是一种最简单、最通用(最支持)的方法,但基本上不能够满足我们的需要。具体的,请参考AutoExp.dat文件中的开始部分。
(2)AddIn方法
这个方法可以参考AutoExp.dat文件中的EEAddIn事例。这个方法的缺点是,能够输出的信息是有限的,因为导出函数的输出缓冲区大小有限制(大概是1000多点个字符),并且只能作为一个字符串输出。对于树这样的结构信息是很难好看的输出的。但是,对于VS2003及之前版本的VS,这是一种最强大的方法了。
但对于官方的示例程序,需要说明几点(我在这里浪费了不少时间):(a)所有导出的方法需要使用WINAPI的调用约定(注意:至少我拿到的官方示例中的导出函数没有使用WINAPI声明,也花了我很多时间才找到问题所在);(b)确保使用了.def文件,这可以通过dumpbin对生成的DLL中导出的符号进行验证;(c)确保你的导出函数被正确实现,否则可能引起VS IDE主程序的crash。
Ref: http://msdn.microsoft.com/en-us/library/8fwk67y3.aspx
在实现自己的AddIn时,还需要注意一些细节:
(a)如果需要处理字符串,那么要区别对待被调试的程序是wchar_t还是char。还有,需要注意导出函数的buffer只能接收char;(b)对于复杂结构的信息提取,需要多次读取内存。
Ref: http://msdn.microsoft.com/en-us/library/aa730838%28VS.80%29.aspx
(3)visualizer方法
这个方法是从VS2005才开始被引入的,很强大,很好使用。相关的好文章也多,还可以参考AutoExp.dat中现有的visualizers。
Ref 1: http://www.virtualdub.org/blog/pivot/entry.php?id=120
Ref 2: http://www.virtualdub.org/blog/pivot/entry.php?id=172
Ref 3: http://mariusbancila.ro/blog/2007/04/06/tweaking-autoexpdat-for-custom-types-in-vs2005/
Ref 4: http://www.idigitalhouse.com/Blog/?p=83
Ref 5: http://blog.csdn.net/ysbcg/archive/2008/09/05/2886926.aspx
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VCExpress\9.0\NativeDE\StepOver
(非Express版,请把VCExpress替换为VisualStudio)
这个特性除了未被公开,在各个版本中设置方法不尽相同之外,还有一个更糟糕的地方,那就是在attach进程时并不会去扫描注册表的这些设置,所以此时这个特性将毫无意义。
Ref:
英文原版:http://blogs.msdn.com/andypennell/archive/2004/02/06/69004.aspx
一个中文版:http://www.cppprog.com/2008/1224/9.html
在VS中,为了调试方便,我们需要为自己的类型定制在Watch窗口中的显示,也就是定制这些类型在Watch窗口中的表达式计算结果。对于VS的不同版本,其方法不尽相同,但都需要用到AutoExp.dat文件。但由于这是一个官方支持的特性,所以我们可以大胆地使用.
(1)AutoExp方法
这是一种最简单、最通用(最支持)的方法,但基本上不能够满足我们的需要。具体的,请参考AutoExp.dat文件中的开始部分。
(2)AddIn方法
这个方法可以参考AutoExp.dat文件中的EEAddIn事例。这个方法的缺点是,能够输出的信息是有限的,因为导出函数的输出缓冲区大小有限制(大概是1000多点个字符),并且只能作为一个字符串输出。对于树这样的结构信息是很难好看的输出的。但是,对于VS2003及之前版本的VS,这是一种最强大的方法了。
但对于官方的示例程序,需要说明几点(我在这里浪费了不少时间):(a)所有导出的方法需要使用WINAPI的调用约定(注意:至少我拿到的官方示例中的导出函数没有使用WINAPI声明,也花了我很多时间才找到问题所在);(b)确保使用了.def文件,这可以通过dumpbin对生成的DLL中导出的符号进行验证;(c)确保你的导出函数被正确实现,否则可能引起VS IDE主程序的crash。
Ref: http://msdn.microsoft.com/en-us/library/8fwk67y3.aspx
在实现自己的AddIn时,还需要注意一些细节:
(a)如果需要处理字符串,那么要区别对待被调试的程序是wchar_t还是char。还有,需要注意导出函数的buffer只能接收char;(b)对于复杂结构的信息提取,需要多次读取内存。
Ref: http://msdn.microsoft.com/en-us/library/aa730838%28VS.80%29.aspx
(3)visualizer方法
这个方法是从VS2005才开始被引入的,很强大,很好使用。相关的好文章也多,还可以参考AutoExp.dat中现有的visualizers。
Ref 1: http://www.virtualdub.org/blog/pivot/entry.php?id=120
Ref 2: http://www.virtualdub.org/blog/pivot/entry.php?id=172
Ref 3: http://mariusbancila.ro/blog/2007/04/06/tweaking-autoexpdat-for-custom-types-in-vs2005/
Ref 4: http://www.idigitalhouse.com/Blog/?p=83
Ref 5: http://blog.csdn.net/ysbcg/archive/2008/09/05/2886926.aspx
相关阅读 更多 +