请教高手:在没有代码的情况下如何知道DLL占用内存过多?

RunningYang 2011-01-15 01:51:35
现在的情况是,我有一个 exe 需要调用有个 dll(假设A),这个 dll 又静态链接了一堆dll(因业务需要,不可精简)
但是在exe中使用 loadlibrary 加载 A 的时候,会失败,错误码是 8 ,也就是空间不足

结果可以理解,因为 A 后面的 dll 实在太多了,所有的dll文件加起来有 500多M(我也很崩溃,怎么这么多!)

经过初步定位,加载失败的原因应该是全局变量过多造成内存不足.

我现在的问题是:
1.一个exe进程所能加载的 dll 内存大小应该是有限制的,好像是256M,但是这个限制是指对什么的限制,例如是全局变量的内存,还是包括代码空间?

2.在没有dll代码的情况下,能否知道每一个dll的初始化的时候所占用的空间?如果可以,如何分析,用什么工具等等?(我简单用了一下 IDA,但是没有什么头绪)

谢谢
...全文
202 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicklisir 2011-01-20
  • 打赏
  • 举报
回复
楼主,知道方法谈谈嘛,我也想知道你怎么解决的,期待回复。。。。。。
schlafenhamster 2011-01-16
  • 打赏
  • 举报
回复
这些dll肯定不是同时使用,你应该根据需要load和unload
lazy_2010 2011-01-16
  • 打赏
  • 举报
回复
关于 64 个静态链接的 dll 的问题,现在记不得如何才能找到资料了;

关于这个问题,你可以这样验证:编写一个简单的 dll,复制文件,然后修改名称成 1.dll, 2.dll, ..., 64.dll;
然后进行 LoadLibrary,...,你会发现不到 64.dll,就会装载失败;

但是如果你使用 LoadLibraryEx,参数 LOAD_LIBRARY_AS_DATAFILE,64 不是一个限制;

记得原因是与 TLS 相关,好多年前的事情了,实在记不得来源了...如果找到了,再说吧
RunningYang 2011-01-16
  • 打赏
  • 举报
回复
我想我已经找到办法了,谢谢各位的帮忙回复!
还有一两个回帖复读机,呵呵
RunningYang 2011-01-16
  • 打赏
  • 举报
回复
楼上说的也是一个办法,但是这个系统是从UNIX移植过来的,因此不大会花很大的力气重构代码,否则会衍生很多问题
现在就是想知道哪些DLL产生了什么问题
不过从回帖来看,好像大家对这方面似乎了解不多。。。
RunningYang 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nicklisir 的回复:]
没听说过,这DLL也太牛了吧,为什么不分成几部分;
[/Quote]

多谢回复

这个已经有考虑的,但是现在的dll有很多,有30个以上(具体多少,我要到公司里才能知道)
但是粗略想了一下,似乎拆分也不会有多少作用

可能是真的很牛,是一个非常大的系统...
具体我也不是很清楚,我是外围人员
RunningYang 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lazy_2010 的回复:]
没听说过 256M 的限制;知道静态 VC 链接库的 dll 个数有个 64 的限制。

帮你顶顶。
[/Quote]

我之所以说 256M 的限制,是因为我重现的时候,测试一个dll,如果申请了过大的内存,编译也能成功
但是会VC会提示:

Release/TestDll.dll : warning LNK4084: total image size 1073803264 exceeds max (268435456); image may not run

TestDll.dll - 0 error(s), 1 warning(s)

因此我觉得是不是说有这个限制,因为这个测试的dll编出来本身是比较小的,才56K,但是编译的时候已经有这样的提示了

另外,你说的 64 个 dll 限制的出处是哪里,能否提供原始文档
非常感谢!
wyx100 2011-01-15
  • 打赏
  • 举报
回复
这么大的DLL,设计上就有点不合理,应该要提供者修改.

RunningYang 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
这么大的DLL,设计上就有点不合理,应该要提供者修改.
[/Quote]

你说的忒对了
小弟也是这么想的,但是要首先定位出是哪个DLL占用的内存过大

PS.
dll的静态大小由于一些原因,无法缩减!
由于历史和现实的原因,真的无法缩减!
现在能做的就是找到具体无法加载的原因,做有限度的优化

能不能有什么办法,谢谢
lazy_2010 2011-01-15
  • 打赏
  • 举报
回复
没听说过 256M 的限制;知道静态 VC 链接库的 dll 个数有个 64 的限制。

帮你顶顶。
oyljerry 2011-01-15
  • 打赏
  • 举报
回复
这么大的DLL,设计上就有点不合理,应该要提供者修改.
nicklisir 2011-01-15
  • 打赏
  • 举报
回复
没听说过,这DLL也太牛了吧,为什么不分成几部分;

15,471

社区成员

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

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