假设 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) |