gcc 在调试使用gdb库的程序时单步执行libcurl函数

hsgswve4  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(103)

我试图调试一个使用libcurl库的程序,并使用gdb单步执行库函数。
我已经尝试过了。我下载了curl的源代码

git clone https://github.com/curl/curl.git

字符串
并使用autotools构建了它(在这篇文章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


现在我可以调试用gdb $HOME/curl/bin/curl生成的curl程序了。
我想要的是调试我自己的程序,并且能够调试它访问libcurl内部。

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函数。
有没有办法做到这一点?

nhhxz33t

nhhxz33t1#

但是当我调试程序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=$HOME/curl/lib

字符串
有了以上内容,与$HOME/curl/lib/libcurl.so链接的a.out可执行文件也将在运行时使用该库,而其他二进制文件将继续使用系统/lib/x86_64-linux-gnu/libcurl.so

相关问题