在调试使用 gdb 库的程序时进入 libcurl 函数

问题描述 投票:0回答:1

我正在尝试调试一个使用 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函数。

有没有办法实现这个目标?

gcc gdb libcurl
1个回答
0
投票

但是当我调试程序 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

© www.soinside.com 2019 - 2024. All rights reserved.