当前位置: 首页 > news >正文

.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

相关文章:

  • 版本控制软件SubVersion 入门
  • ORACLE中添加删除主键
  • 现场总线CANopen设计与应用
  • 一份DBA面试题及解答
  • 方程组的几何解
  • 做人之上品
  • 3D数学基础:矩阵的几何解释
  • DBC和J1939理解(也许不正确,探索阶段)
  • 上传文件
  • DBC(解决上一篇的疑问)
  • zynq移植J1939协议
  • zynqCAN中断梳理
  • zynqIO中断梳理
  • 上传wmv文件遇到的问题
  • linux高并发服务器
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • Akka系列(七):Actor持久化之Akka persistence
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular数据绑定机制
  • CAP理论的例子讲解
  • express + mock 让前后台并行开发
  • express如何解决request entity too large问题
  • hadoop集群管理系统搭建规划说明
  • interface和setter,getter
  • jquery cookie
  • Mocha测试初探
  • PHP变量
  • Swoft 源码剖析 - 代码自动更新机制
  • Vim Clutch | 面向脚踏板编程……
  • 机器学习中为什么要做归一化normalization
  • 将回调地狱按在地上摩擦的Promise
  • 前嗅ForeSpider教程:创建模板
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信小程序开发问题汇总
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​TypeScript都不会用,也敢说会前端?
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (6)STL算法之转换
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .NET DataGridView数据绑定说明
  • .Net IE10 _doPostBack 未定义
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 托管代码与非托管代码
  • .NET是什么
  • .Net语言中的StringBuilder:入门到精通