.NET CF命令行调试器MDbg入门(四) Attaching to Processes

.NET CF命令行调试器MDbg入门(四) Attaching to Processes
老狼的话:David Kline是.NET CF团队一位非常优秀的开发者,看到他这个系列文章已经很久了,一直没空翻译。今天用下班后的时间翻译出来,也是希望有个督促,能让这个系列文章让更多朋友认识。原文地址:
http://blogs.msdn.com/davidklinems/archive/2006/08/25/724718.aspx

能够attach到一个运行中的进程中是调试器非常强大的一个功能。这项功能对于调试运行中的应用程序特别便利。对于CorDbg来说,当调试.NET CF程序时,并不支持正式的attach process。使用.NET CF MDbg调试器扩展(2.0版本SP1),支持在命令行中附加调试器到一个运行中的程序中。

注意:在我们附加MDbg到我们的应用程序(Visual Studio 2005 WebCrawler sample)之前,我们必须让设备支持attach to process。这个步骤要在我们想调试的应用程序启动之前完成。

当调试一个.NET CF应用程序时,第一步是使用MDbg加载.NET Compact Framework 扩展(mdbgnetcf.dll)。一旦扩展被加载,我们可以创建一个连接到我们的目标设备。这些在 本系列的第一部分有描述。

下一步是启动我们希望调试的应用程序。应用程序可以通过在设备中点击它们的图标来启动,或者可以通过MDbg的cp[roc]命令(创建进程)。因为我们已经设置了调试器环境,所以我通过cp[roc]命令来启动进程。关于cp[roc]和其他进程控制命令的更多信息可以查看 本系列的第三部分

mdbg> cp "\program files\webcrawler.exe"

我们的应用程序现在已经在设备中启动了。为了attach,我们需要知道应用程序的进程ID。

mdbg> pro
Active processes on current machine:
<< additional processes removed for clarity >>
(PID: 0x6de24e9a) webcrawler.exe

通过输入,我们可以看到WebCrawler的进程ID是0x6de24e9a,我们将使用这个值来attach我们的应用程序。

mdbg> a 0x6de24e9a

在attach之后,我们将不会返回到mdbg>的提示符,为了能够开始调试我们的应用程序,我们需要使用Ctrl+C来打断调试器。

<Ctrl+C>
STOP AsyncStop
[p#:0, t#:no active thread] mdbg>

现在我们可以调试WebCrawler了。现在让我们在Crawler类的Crawl方法里设置一个断点。

在CorDbg中设置断点是具有挑战性的事情,为了能够成功的设置断点,我们必须输入精确的方法名称(区分大小写)。在MDbg中这将变得简单。使用x命令,我们可以在WebCrawler模块中搜索我们感兴趣的方法。

[p#:0, t#:no active thread] mdbg> x WebCrawler
~0. Microsoft.Samples.NetCF.Crawler.add_CurrentPageEvent(value)
~1. Microsoft.Samples.NetCF.Crawler.remove_CurrentPageEvent(value)
~2. Microsoft.Samples.NetCF.Crawler.add_PageFoundEvent(value)
~3. Microsoft.Samples.NetCF.Crawler.remove_PageFoundEvent(value)
~4. Microsoft.Samples.NetCF.Crawler.add_CrawlFinishedEvent(value)
~5. Microsoft.Samples.NetCF.Crawler.remove_CrawlFinishedEvent(value)
~6. Microsoft.Samples.NetCF.Crawler..ctor(startingPage,noProxy)
~7. Microsoft.Samples.NetCF.Crawler.Start()
~8. Microsoft.Samples.NetCF.Crawler.Stop()
~9. Microsoft.Samples.NetCF.Crawler.PageIsHtml(pageAddress,status)
~10. Microsoft.Samples.NetCF.Crawler.GetPageData(pageUri,pageData)
~11. Microsoft.Samples.NetCF.Crawler.GetPageLinks(pageUri,pageBody,tag,attribute,links)
~12. Microsoft.Samples.NetCF.Crawler.Crawl()
~13. Microsoft.Samples.NetCF.Crawler.CurrentPageEventHandler..ctor(object,method)
~14. Microsoft.Samples.NetCF.Crawler.CurrentPageEventHandler.Invoke(sender,e)
~15. Microsoft.Samples.NetCF.Crawler.CurrentPageEventHandler.BeginInvoke(sender,e,callback,object)
~16. Microsoft.Samples.NetCF.Crawler.CurrentPageEventHandler.EndInvoke(result)
~17. Microsoft.Samples.NetCF.CurrentPageEventArgs.get_PageAddress()
~18. Microsoft.Samples.NetCF.CurrentPageEventArgs..ctor(page)
~19. Microsoft.Samples.NetCF.LinkInfo.get_LinkPath()
~20. Microsoft.Samples.NetCF.LinkInfo.get_StatusCode()
~21. Microsoft.Samples.NetCF.LinkInfo.set_StatusCode(value)
~22. Microsoft.Samples.NetCF.LinkInfo..ctor(path,status)
~23. Microsoft.Samples.NetCF.MainForm..ctor()
~24. Microsoft.Samples.NetCF.MainForm.Dispose(disposing)
~25. Microsoft.Samples.NetCF.MainForm.InitializeComponent()
~26. Microsoft.Samples.NetCF.MainForm.Main()
~27. Microsoft.Samples.NetCF.MainForm.startButton_Click(sender,e)
~28. Microsoft.Samples.NetCF.MainForm.HandleCurrentPageEvent(sender,e)
~29. Microsoft.Samples.NetCF.MainForm.HandlePageFoundEvent(sender,e)
~30. Microsoft.Samples.NetCF.MainForm.HandleCrawlFinishedEvent(sender,e)
~31. Microsoft.Samples.NetCF.MainForm.HandleActivityLightsEvent(unused,notused)
~32. Microsoft.Samples.NetCF.MainForm.CustomInvokeRequired()

在这个列表中,我们看到条目12是我们要找的方法。为了给Crawl方法设置一个断点,我们可以引用条目数。

[p#:0, t#:no active thread] mdbg> b ~12
Breakpoint #1 bound (:1!Microsoft.Samples.NetCF.Crawler::Crawl(+0))

当我们继续执行应用程序(并在WebCrawler应用程序中点击Start),我们将停止在Crawl方法开始的地方。

[p#:0, t#:no active thread] mdbg> g
STOP: Breakpoint 1 Hit
located at line 380 in Crawler.cs
[p#:0, t#:no active thread] mdbg>

Enjoy!
-- DK

你可能感兴趣的:(thread,.net,Microsoft)