更多文章欢迎访问 程序员小非 博客
在调试C++程序的时候,我们并不是每次都能拿到源代码,很多时候我们只能得到一个动态库so,调试时这个动态库就是一个黑匣子,没办法查看修改或者在里面加日志,那么我们是不是就没有任何办法对我们感兴趣的函数和参数进行监控和跟踪了呢?
对于这种情况,我们一般会挂上gdb
,然后在我们感兴趣的地方打上断点,然后查看堆栈里的变量的值。但这个过程时比较繁琐的,尤其是在需要了解程序执行的大量中间过程时是非常让人抓狂的。下面我们将介绍一种使用钩子函数的方法,来修改目标函数的运行时的行为,来达到我们跟踪函数运行的目的。
钩子函数可以在运行时劫持预先存在的函数,我们可以在钩子函数里对预先的函数做一些包装,使得函数保持原来的功能的前提下做一些额外的操作。在本文中我们主要的是linux系统的动态加载API,动态加载允许在运行时加载并运行动态链接库里的函数,所以我们可以把钩子函数打包成动态链接库,以实现对现有函数的劫持。实现这个功能需要用到LD_PRELOAD环境变量,使用LD_PRELOAD加载的动态库会最先被加载,这就使得我们有机会可以在钩子函数里运用动态加载技术将原先的函数绑定到钩子函数中,从而达到监控及跟踪的效果。
下面就以最简单的hello world的例子来讲解这一切是怎么做到的。
首先main函数,helloworld.c
#include <stdio.h>
#