解惑

解己之惑,解人之惑

标签:调试

_nt_symbol_path

备忘下,设置这个环境变量后可以调试系统的DLL,可以自动从微软的网站下载PDB:

Set _NT_SYMBOL_PATH = symsrv*symsrv.dll*f:\localsymbols*http://msdl.microsoft.com/download/symbols

不过加上以后调试超级慢,平时还是不要用了。

调试进程

说实话,这个特性是我做windows开发以来最为赞赏的一个微软的功能。按照一个现在的同事好友的说法(他以前是微软的,铁杆的微软派),只要你有PDB和源代码,你就可以调试任何进程,从目前我的试验来看,此言不虚,而且做起来也不难:

  • 打开一个新的Visual Studio(我用的2005)
  • 选择Tools->Attach to Process
  • 选择你想调试的进程,在选择的时候注意可能要修改Code Type,就我们的项目而言,外壳是C#的,但是调用的都是C++写的COM,所以我把Code Type从自动修改成Managed和Native。
  • 在自动打开的Modules里面选择你需要调试的module,就是load symbol(其实也可以通过Tools->options->debugging->symbols设置全局的symbol,这样就不用每次debug的时候手动的load symbol了),其实就是PDB文件
  • 打开源代码,不需要创建任何工程或者Solution,在进程的操作会触发的地方设置一个断点,等待或者手工触发那个断点的路径

调试COM

对于熟悉的人而言,这个可能不是什么问题,但是对于我这个.net菜鸟和其它的菜鸟,可能还是有用的。

我们新的项目是基于.NET开发的,而我们要调用或者说依赖很多C++的COM组件,我们有COM的源代码,我们的.NET代码在调用COM的时候经常会有问题,但是我们想知道到底是什么问题,这样就需要跟踪进COM里面,详细的步骤在这里:
http://support.microsoft.com/kb/919519
这个KB是How to debug a COM+ component by using Visual Studio 2005 or by using Visual Studio .NET

不过这个KB还不够,它指出了原理性的东西,但是还有些细节没有说:
如果你的工程是C#的工程或者是其他的.NET的工程,那么需要修改工程的debug属性,把Enable unmanaged code debugging选中(如果不选中这个,那么会出现the symbol file does not match the module,即使其实他们是match的)。
那个KB很长,其实重点就是两个:

  • 在Solution的属性里面,把COM的源代码的目录加进去
  • 在VS的选项里面,把COM的symbol加进去,这样就不用在你自己的代码里面设断点再load symbol了

另外文章中的那个加载dllhost那个进程的操作似乎是不需要的,我现在没有操作,可能那个操作对调试COM+有用,对于普通的COM不需要。

Grails还不够成熟

因为GAE的问题打算转用Grails,但是真正用起来还是发现不少问题,虽然很多IDE号称可以用于调试Grails/Groovy,但是真正使用起来不是那么回事,我已经试了Eclipse和Netbeans,都不能调试,后来看到说Intellij对Grails的支持是最好的,刚好我们用的是商业版的Intellij,下了插件,按照别人的文章发现在Settings中根本找不到Grails/Groovy的配置项,找了一大圈,到插件的主页才看到别人提问,有人回答说新版本的插件把那个配置移到工程的属性里面去了,添加了Grails Facets后就可以配置了,如回答所言添加了,发现Grails1.1.1的配置完点击Apply或者OK后那个Grails的配置消失了,试了几次都如此,无语,继续到插件的主要看,看到不少人要求IDEA尽快更新插件以支持Grails1.1,但是IDEA无动于衷,那个插件最后的更新时间是一年前了。如果Grails不能解决在IDE里面的调试问题,那么使用Grails只能加快一部分的开发,而减慢真正的开发中耗时的调试工作,总不见得让我们加log去做调试的工作吧(虽然Groovy是动态语言,随时修改随时生效)。不过Intellij对Grails的支持确实是最好的,起码我在Groovy文件中设置的断点可以正常的起作用。

BootStrap的问题

本来打算用GAE构建这个系统的,但是发现了严重的问题,所以经过考虑决定用Grails了,主要是为了能够更快的出一个可用的版本,暂时可能就随便找个机器放一下了。

开始使用Grails感觉还不错,但是真正开始使用马上就遇到问题了。
定义了User类,有些属性是可选的,然后在BootStrap的时候创建Administrator用户,发现没有创建出来。开始以为BootStrap没有被调用,加了log.error,控制台支持打出那个信息了,百思不得其解,如果有问题应该会有错误日志啊,但是没有发现任何错误,控制台同样也没有,而且那个语句后面的log语句也正常执行了,应该没有什么问题才对啊。
幸亏我这些年的经验没有白费,也还好我是一个基本上可以怀疑一切的人,马上怀疑是不是构造那个对象写的不对,因为初始化的时候我只设置了不能为空的属性,把全部的属性的值设置上,马上就搞定了。

对Grails的印象打了个大大的折扣,不过还是再试试吧。其实这个也是Grails的调试问题,试了下Eclipse的调试功能,发现不能定位到groovy文件,据说Netbeans可以,下载个试试看了。

更新:
Netbeans也不能调试Groovy,或者我还没有玩出来,反正断点设置好了,以debug模式启动,倒是打开了JavaScript调试器。
不可否认的是,Netbeans对Grails的支持确实是最好的,不需要再打开一个DOS窗口执行那些命令了。而且我在DOS窗口掉那些命令的时候总是有一个错误警告窗口,总是报告:"find.exe – Entry Point Not Found",原因无法定位动态链接库ulib.dll中的入口点。

Java远程调试

其实就是使用了JDK的JPDA,在启动服务器(Jboss或者Tomcat等)的命令行参数里面加上:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

以Eclipse作为调试工具的话,创建一个Remote Java Application,连接参数填写正确的IP和端口(就是上面的8787)就行了

© 2024 解惑

本主题由Anders Noren提供向上 ↑