检查程序对动态库的依赖

转载请注明出处:http://blog.csdn.net/horkychen

测试程序时会出现找不到指定的库或库函数的错误,表示某个依赖库不存在或版本不正确。如果使用的是动态加载的动态库所依赖的包不存在,如果程序没有做好异常处理的话,会让你很难定位到问题。比如GDI+库。假设一个程序A,调用了动态库B,而B链接了GDI+,这时运行在Windows 2000上时,系统里没有GDI+的库,会导致A不断Crash掉。因为GDI+库不是一般C的动态库,一般没有库加载的动作,使得排查问题会有很多的障碍。

这时,我们如果利用依赖关系的查看工具就可以容易判断出来。在Linux中可以使用ldd指令很容易地获得依赖包信息。而在Windows中,就可以使用Dpendency Walker,一个曾经包在Visual Studio 6中的工具。

下面是一个示例。这个程序是使用Cygwin编译的,在没有Gygwin的环境下运行不了,因为缺少了依赖的库。

下载地址:http://dependencywalker.com/

 

不得已的时候也可以使用命令行的方式执行。比如下面的指令:

depends -c -f:0 -u:1 -pa:1 -pf:1 -pe:1 -pl:1 -pg:1 -sm:12 -sf:4 -ot:result.txt D:\Project\UnixTools\assert.exe

IDE调试而不断加入Debug信息的时候,或许它能帮你一把。

在程序运用有时需要查看一下当前程序加载了哪些库,推荐Process Explorer。它是一个比较全面的工具。可以快速定位程序,支持单独查看单个进程的CPU及内存占用情况等。

还有一个轻量级的工具可以使用:CurrProcess,来自一家很牛的技术公司:NirSoft

 在Linux和Mac OS下系统提供的工具就可以做到。Mac OS 下是Activity Monitor, 在Linux下(Debian)是System Monitor或者如下的命令行:  

  cat /proc/<pid>/maps  (至于细节,可以参考:http://blog.csdn.net/z_man/article/details/3839677)

下面是两个系统下的截图:

Activity Monitor in Mac OS

 *(双击选中的进程)

System Monitor in Linux:

*(右击选中的进程,选择Maps).

总之,工欲善其事,必先利其器!

时间: 2024-11-01 03:13:10

检查程序对动态库的依赖的相关文章

ldd 查看程序/动态库 的依赖

今天在帮同事查看一个问题时, 需要用到ldd, 于是就顺便看了一下ldd的实现. 好在ldd本身只是一个脚本, 而不是executable, 可以直接查看实现的代码. 根据注释:  21 # This is the `ldd' command, which lists what shared libraries are 22 # used by given dynamically-linked executables.  It works by invoking the 23 # run-tim

分析Windows和Linux动态库_unix linux

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植.本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验. 1.引言 动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用

makefile把一个 .cpp文件和它所依赖的几个 .a(静态库文件 ) 生成一个动态库文件.so

问题描述 makefile把一个 .cpp文件和它所依赖的几个 .a(静态库文件 ) 生成一个动态库文件.so 假设编译交叉编译工具路径为dir1(arm-linux-androideabi-gcc-4.9 ),存放生成的.so文件的路径为dir2,test.cpp,依赖1.a,2.a,3.a这三个静态文件库,Makefile文件应该怎么写 解决方案 arm-linux-androideabi-gcc-4.9 -fPIC -shared -o dir2/xxx.so test.cpp 1.a 2

关于Linux静态库和动态库的分析

原文:http://linux.chinaunix.net/techdoc/net/2009/02/04/1060670.shtml 1.什么是库 在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的本质不同,因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库.2.库的种类linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同.静态库的代码在编译

Linux下如何用GCC编译动态库

  本文主要解决以下几个问题 1 为什么要使用库? 2 库的分类 3 创建自己的库 或许大家对自己初学 Linux时的情形仍记忆尤新吧.如果没有一个能较好的解决依赖关系的包管理器,在Linux下安装软件将是一件及其痛苦的工作.你装a包时,可能会提示你要先装b包,当你费尽心力找到b包时,可能又会提示你要先安装c包.我就曾被这样的事搞的焦头烂额,至今一提起rpm仍心有余悸,头皮发麻.说是一朝被蛇咬,十年怕井绳怕也不为过. Linux下之所以有这许多的依赖关系,其中一个开发原则真是功不可没.这个原则就

【原创】Linux下共享库嵌套依赖问题

问题场景:  动态库 librabbitmq_r.so 内部依赖动态库 libevent_core.so 和 libevent_pthreads.so : 可执行程序 sa 依赖动态库 librabbitmq_r.so ; 在链接生成 sa 的时候希望只指定 librabbitmq_r.so 而不指定 libevent_core.so 和 libevent_pthreads.so . 错误信息:  ... g++ ../source/authorisecfg.o ../source/bmcins

java-Java程序调用动态库的问题,Can&amp;amp;#39;t find dependent libraries

问题描述 Java程序调用动态库的问题,Can't find dependent libraries win7 32位系统上,java程序调用Qt写的动态库,Qt build的时候没报任何错.System.load()的时候报错Can't find dependent libraries. 我用depends.exe 这个工具查看DLL信息,开始的时候确实报错说有几个依赖的动态库找不到,我就在网上下载了放到system32目录下.depends不报错了(但是有一个警告:At least one

【短视频SDK】如何导入Android的AAR?动态库so文件到底怎么样放呢?

开发者在拿到短视频Android的SDK的时候会有些觉得不太一样,为什么SDK提供的是AAR文件和几个so文件呢?我们常见的SDK不是都是jar包吗?文本试图将AAR是什么,如何导入出现的问题进行一个归纳总结,希望开发者读完能够解决这种类型的问题. 1.什么是AAR文件?如何导入AAR文件? 1.1 什么是AAR文件? 开发者在开发的时候大家都遵循组件化的思路写代码,比如我们在写一个圆形的自定义组件的时候,这个组件是一个独立的组件,但是他可能不仅仅包含Java代码,还有很多资源甚至是底层so文件

浅谈动态库符号的私有化与全局化

之前一篇<记一个链接库导出函数被覆盖的问题>中,描述了这样一个问题:动态库若想使用自己的符号,不受可执行程序(或其他动态库的影响),可以使用-Wl,-Bsymbolic链接参数或version_script来让动态库的符号自我解决,而不必通过全局符号表来动态解决. 之前的文章也提到,使用-Wl,-Bsymbolic这样的方法是存在隐患的.最近又遇到这样的例子,动态库使用了私有的符号导致dynamic_cast.throw可能达不到程序预想的效果. 另外,除了显式的使用-Wl,-Bsymboli