我正在尝试调试一个使用 libcurl 库的程序并使用 gdb 进入库函数。
到目前为止我所尝试过的。我下载了curl的源码
git clone https://github.com/curl/curl.git
并使用自动工具构建它(在这篇文章之后
https://askubuntu.com/questions/27677/cannot-find-install-sh-install-sh-or-shtool-in-ac-aux
):
libtoolize --force
aclocal
autoheader
automake --force-missing --add-missing
autoconf
配置如下:
./configure --prefix=$HOME/curl --enable-debug
终于
make
make install
现在我可以调试用
curl
生成的 gdb $HOME/curl/bin/curl
程序了。
我想要的是调试我自己的程序,并能够通过访问 libcurl 内部结构来调试它。 所以我尝试了这个简单的例子https://everything.curl.dev/libcurl/examples/get,我用它构建了
gcc -g example.c -L$HOME/curl/lib -lcurl
看起来它正在链接我刚刚构建的源,因为
gcc -g -Wl,--verbose example.c -L${HOME}/curl/lib -lcurl | grep "libcurl.so succeeded"
给予
attempt to open /home/user//curl/lib/libcurl.so succeeded
但是当我调试程序时
gdb ./a.out
我无法跳转到libcurl函数。
有没有办法实现这个目标?
但是当我调试程序 gdb ./a.out 时,我无法跳转到 libcurl 函数。
这是因为(静态)链接时使用的库和运行时使用的库不一定匹配,并且在您的情况下也不匹配。
为了使它们匹配,您需要告诉运行时加载程序在哪里寻找
libcurl.so
。
您可以使用
export LD_LIBRARY_PATH=$HOME/curl/lib
执行此操作,但这是 次优 - 此环境变量会影响 所有 程序,并可能导致它们崩溃。
一个更好的方法是设置特定程序的
RUNPATH
:
gcc -g example.c -L$HOME/curl/lib -lcurl -Wl,-rpath=$HOMOE/curl/lib
如上所述,与
a.out
链接的 $HOME/curl/lib/libcurl.so
可执行文件将 also 在运行时使用该库,而其他二进制文件将继续使用系统 /lib/x86_64-linux-gnu/libcurl.so
。