请问:这种情况下如何跟踪调试DLL呢?

yuvotesyg518 2009-02-17 08:56:33
环境描述:
=====
我有一个服务程序(暂且命名为:service.exe),它在启动的时候加载动态链接库(暂且命名为:dynamic.dll,有源码)。

疑问需求:
=====
我如果才能跟踪调试dynamic.dll这个动态链接库呢?包括单步运行、设置断点等。
如果宿主程序是普通的EXE文件,倒也很简单就可以实现。
现在宿主程序是服务程序,我一下子就不知道怎么弄才好了,做了好几种尝试,都没有成功。
呵呵,看来还是某方面的理论欠缺了。

调试环境:
=====
VC++ 6.0
调试对象:dynamic.dll的程序源码
...全文
173 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang_jd 2010-01-12
  • 打赏
  • 举报
回复
.......
WUYUZHONG
KeSummer 2009-02-17
  • 打赏
  • 举报
回复
lz是无视别人答案型的网友。。呵呵~~~
cnzdgs 2009-02-17
  • 打赏
  • 举报
回复
在要调试的地方加一行__asm int 3;编译后启动服务,当VC会捕获到异常后开始调试。
oyljerry 2009-02-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yuvotesyg518 的回复:]
谢谢大家的积极帮助啊,不过看起来大家应该还没有明白我的意思。
有两点特别的地方,请大家注意:
1、宿主程序是服务,不是普通的应用程序;
2、我要调试的对象是服务启动时加载的那个动态链接库,而不是服务本身;
[/Quote]
如果一定要调试,就按我前面说的方法1. 或者你还可以通过服务管理器来启动,停止服务,然后你的编译器就可以attach调试你的dll了
KeSummer 2009-02-17
  • 打赏
  • 举报
回复
首先:在DLL入口放个DebugBreak();或者MessageBox+全局显示参数。
其次:启动VC2003或者以上版本
再次:net start 你的服务,会显示崩溃或者对话框
最后:在Debug菜单上选择附加调试,选中你的服务进程,这时会自动定位到DLL代码。然后单步吧。。。
yuvotesyg518 2009-02-17
  • 打赏
  • 举报
回复
谢谢大家的积极帮助啊,不过看起来大家应该还没有明白我的意思。
有两点特别的地方,请大家注意:
1、宿主程序是服务,不是普通的应用程序;
2、我要调试的对象是服务启动时加载的那个动态链接库,而不是服务本身;
oyljerry 2009-02-17
  • 打赏
  • 举报
回复
其实主要还是查看日志等,对于服务这种程序来说,这个方法最好,也是比较好的软件发布后,分析问题的重要手段,因而在关键位置等记录好日志也是很重要的
yuvotesyg518 2009-02-17
  • 打赏
  • 举报
回复
谢谢,不过你提供的方法对服务程序来说是不适用的,它适用于普通的exe程序。
stivenjia 2009-02-17
  • 打赏
  • 举报
回复
用ide 打开dynamic.dll工程设置宿主运行程序保存设置调试运行,最简单的方法。
oyljerry 2009-02-17
  • 打赏
  • 举报
回复
调试服务程序的方法

方法一:

1. 建立windows服务程序,不管你是用win32 API,还是ATL,还是.NET,都可以实现的。
2.将代码写好,编译,保证没有错误。
3.现在到了调试的过程了,首先,在IDE中,找到你要调试的地方,加上断点,然后安装好服务。
服务的安装,其实就是设计到注册表的操作。在.NET平台下,我一般习惯用installutil这个程序来安装服务。安装好之后,我们打开控制面板的 “Administrator Tools”,找到"Services"选项,双击打开。在服务列表中,我们能找到我们安装的服务。然后运行这个服务。
4.现在到了关键的地方,在服务开始的时候,就会执行你的代码。为了调试的方便,我是在服务的代码开始处让,程序先Sleep20秒,这样的好处看后面你就知道了。
5. 切换回我们的IDE,在Debug菜单,里面有个Process(进程)选项。点击打开,在对话框的进程列表中,选择我们的服务相对应的进程,然后点击旁边的Attach(附加)按钮。这样,IDE就开始加载我们要调试的进程了。加载完毕之后,程序会停顿一下。(为什么?因为我们在服务的开始代码处,Sleep了20秒,喝口水等一下吧)。之后,黄色的光标,跳动到你的断点处,现在就可以像以往一样,来调试这个windows服务了。
之所以在程序开始的地方Sleep20秒,是为我们在IDE附加这个Service进程的时候,留下一段缓冲的时间,不然当你的服务开始运行的时候,你的断点处的代码早就被执行过了,你断点自然不起作用了。

方法二:

在要下断点的地方用_ASSERT(FALSE);或者DebugBreak();启动Debug版Service。
出现错误提示框时选择Cancle进入调试(DebugBreak),或则选择Retry(_ASSERT),然后打开Stack,定位到向调试的函数里。

方法三:

在服务程序里直接输出OutputDebugString,然后用debugview来观察。

方法四:

还有就是写日志文件。这也是调试windows service的一个比较好的方法,虽然比较笨,但是通过阅读你自己留下的日志,也能起到不小的作用的。所以在编写程序的时候,要在关键的地方,记录日志,也是为以后程序的维护提供方便。
闪破风浪 2009-02-17
  • 打赏
  • 举报
回复
项目设置——》选择你的Dll工程——》选择调试为Debug——》在Executable For Debug Session填入:你的执行程序绝对路径(包括程序本身,如:D:\service.exe)——》在Working Directory填入:你的执行程序绝对路径(不包括程序本身,如:D:\)
就可以对你的Dll程序断点等调试了
ouyh12345 2009-02-17
  • 打赏
  • 举报
回复
windbg 远程调试
authenticationf 2009-02-17
  • 打赏
  • 举报
回复
帮顶
netsocket 2009-02-17
  • 打赏
  • 举报
回复
帮顶

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧