检查程序对动态库的依赖

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

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

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

检查程序对动态库的依赖_第1张图片

下载地址: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及内存占用情况等。

检查程序对动态库的依赖_第2张图片

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

检查程序对动态库的依赖_第3张图片

在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

检查程序对动态库的依赖_第4张图片

*(双击选中的进程)

System Monitor in Linux:

检查程序对动态库的依赖_第5张图片

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


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

你可能感兴趣的:(动态库)