DLL有办法调试吗?

mbctb 2011-01-31 09:08:46
我用的是VC++6.0,我发现EXE文件很好调试,在VC++环境中设置断点,按F5就进入调试状态。程序会自动停在断点处。

可是DLL文件并不是一个主动执行的文件,可是嵌入到别的程序中供别的程序调用的。只有别的程序加载它了,它才被装入到内存中并处于执行状态。

那么DLL有办法调试吗?

(我试着在EXE文件中设置了一个断点,并编码。然后并不是按F5,而是直接双击这个EXE文件执行它,发现它不能停在断点处,也就是说:设置断点并编译以后,EXE中并不存在这个断点,而只能在编译环境下按F5调试,这个断点才能起效,是吗?)

...全文
118 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
red_279 2011-02-03
  • 打赏
  • 举报
回复
需要有DLL的源码,然后进行跟踪。
Allen_zhang 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mbctb 的回复:]
哦,明白了,原来当被调试的文件是DLL文件的时候,在按F5时,会弹出一个对话框,让你选择调用此DLL的文件。

我试着选择记事本作为程序,结果弹出一个对话框,告诉我记事本不含有调试信息。再按确定后说一个或多个断点不能被设置,程序在被结束在开始处。

看来确实得自己写个EXE调用此DLL。
[/Quote]

你选择记事本也是可以的,不过这个时候记事本还没有加载dll,dll里面所有的断点都无效。当你的记事本加载dll的时候,可能整个流程已经走完了,这样就达不到你要的调试效果

自己写一个exe来调试的话,这样会比较方便,想在哪里停就哪里停,想看啥都可以,这样你都可以dll的入口处断点,这样想要调试dll就容易多了。

至于版本,debug或者release都可以的,不过你自己调试用的话,debug是最方便咯

再说自己写一个exe很简单嘛,自动生成一个对话框程序就可以了,再把你的dll加载进来就ok了

一般写dll的时候,都会附加写一个调试程序的,我们基本都是这样做。
手机写程序 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mbctb 的回复:]
引用 6 楼 allen_zhang 的回复:
如果是这样的话,我建议你自己写一个dll的调试程序。
自己写一个exe,然后用这个exe来调用你的dll,这样就可以调试了

请问自己写一个EXE,只要很简单的就行是吗?是不是要编译成DEBUG版本而不能编译成RELEASE版本?
[/Quote]
一般来说debug版对应exe的debug,release版对应release版。
mbctb 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 allen_zhang 的回复:]
如果是这样的话,我建议你自己写一个dll的调试程序。
自己写一个exe,然后用这个exe来调用你的dll,这样就可以调试了
[/Quote]
请问自己写一个EXE,只要很简单的就行是吗?是不是要编译成DEBUG版本而不能编译成RELEASE版本?
mbctb 2011-01-31
  • 打赏
  • 举报
回复
哦,明白了,原来当被调试的文件是DLL文件的时候,在按F5时,会弹出一个对话框,让你选择调用此DLL的文件。

我试着选择记事本作为程序,结果弹出一个对话框,告诉我记事本不含有调试信息。再按确定后说一个或多个断点不能被设置,程序在被结束在开始处。

看来确实得自己写个EXE调用此DLL。
mbctb 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 allen_zhang 的回复:]
如果是这样的话,我建议你自己写一个dll的调试程序。
自己写一个exe,然后用这个exe来调用你的dll,这样就可以调试了
[/Quote]
非得自己写EXE吗?

我可以把编译的目标文件直接设为系统目录的IME文件,这样一编译,就直接覆盖那个输入法的IME。

但是问题在于:如果记事本已经选择了该输入法,也就是说该输入法已经被加载并映射到记事本的地址空间去了。此时在VC环境中作的任何改动,比如设置断点,还有什么运行到当前光标所在处等等,还有用吗?

我其实也就是需要在DLL中设置断点,然后在程序停在断点的时候,查看各变量的值,这个基本上就行了。更复杂的调试我也不需要。

Allen_zhang 2011-01-31
  • 打赏
  • 举报
回复
如果是这样的话,我建议你自己写一个dll的调试程序。
自己写一个exe,然后用这个exe来调用你的dll,这样就可以调试了
mbctb 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 allen_zhang 的回复:]
一样可以调试的,和exe一样
你调试的时候选择可运行程序选择你调用dll的exe,在你的exe加载dll后,dll中就可以断点调试了
[/Quote]
感谢!可是我还是不完全明白。

我说得具体一点,我的DLL是一个输入法模块,在VC++6.0中编译成DLL文件后,再用安装程序安装,安装程序也是我自己做的,实际上就是把这个DLL文件挎贝到系统目录,并把扩展名改为.IME,并在注册表中注册一下就行了。

然后打开一个编辑软件,比如记事本,然后选择该输入法,选择该输入法的时候,该输入法的DLL就被加载,并映射到记事本的地址空间。

那么调试具体应该如何进行呢?在VC++6.0环境中,源码中设置断点?是在VC环境中执行“记事本”吗?怎么执行?如果是在VC环境之外执行记事本,再选择该输入法,可是这时加载的是已经编译并安装过的DLL,这时你再在VC++环境中还好调试吗?
mbctb 2011-01-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liyu1128 的回复:]
dll文件调试是可以跟踪进去,但不能改动。。。
除非你有这个dll源码,跟踪错误,在源码里调试。。。
[/Quote]
我不要改动。我只想象调试EXE文件一样,设置断点,在断点处查看各变量的值,基本上也就明白程序错在何处了。

我当然有这个DLL的源码,就是我编的。

在源码里调试如何进行?
Allen_zhang 2011-01-31
  • 打赏
  • 举报
回复
一样可以调试的,和exe一样
你调试的时候选择可运行程序选择你调用dll的exe,在你的exe加载dll后,dll中就可以断点调试了
我的送神 2011-01-31
  • 打赏
  • 举报
回复
dll文件调试是可以跟踪进去,但不能改动。。。
除非你有这个dll源码,跟踪错误,在源码里调试。。。
dulvtianya 2011-01-31
  • 打赏
  • 举报
回复
在dll设置断点,debug在可执行模块中输入你要执行的exe所在位置。

15,471

社区成员

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

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