Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2347051
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-12-18 09:20:26

假设 A.exe 在运行中使用了 B.dll, 不管是隐式还是显式, B.dll已经加载到进程空间的情况下.

如果开发者发现了一个bug, 编译了一个新版本的B.dll, 在没有退出A.exe对应的进程的情况下, 是不能替换磁盘文件上的B.dll的, 此时B.dll也是禁止删除的.

但是, 允许更改B.dll的文件名.

这一点诱使我把原来的B.dll更改为B.dll.old, 然后把新的B.dll复制过来, 看似机巧, 实际麻烦无穷.

既然能把新的B.dll 复制过来, 我当然假设现在再操作A.exe对应的进程就应该使用最新的 B.dll, 毕竟我很清楚的知道什么功能通过B.dll实现的, 实际上, 使用的仍是老的B.dll.old中的代码, 调试者会百思不解为什么明明修改了代码但看起来就是不生效. 使用调试器查看进程中加载了哪些模块时, 发现B.dll.old, 当然没有B.dll.

Windows操作系统使用内存映射技术加载模块时, 很可能并不是在内部记着它的文件访问路径名.

Linux系统中一个模块正被进程加载时也是可以删除/覆盖的.

昨天调试程序碰到了这个问题. 好在很快就在调试器中看清楚了.
阅读(794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~