2012-04-24 90 views
0

我已经下载了GMP库5.02的来源,以及 - 如建议here最大可调试 - 我跑:如何跟踪或调试GMP?

./configure --disable-shared --enable-assert --enable-alloca=debug --host=none CFLAGS=-g 

和使用make编译,然后安装了使图书馆安装。然后我编译我的程序是这样的:gcc -lgmp -std=c99 -g -c program.c然后我跑了:ltrace ./a.out

但是我意识到ltrace根本就不能调用我可以在源代码中找到的TRACE()函数。我想追踪TRACE()中的内容。

我应该怎么做?还是有任何其他直接的方法在GMP库内进行调试? (我无法弄清楚如何用gdb做它,它从来不想进入gmp_printf)

谢谢。

编辑: 我试图进一步调查,并意识到我不能修改GMP库,虽然我有源。我在mpz_init2函数的开头插入了一个printf("hello\n");,我在程序开始时调用了该函数,我重新编译了所有GMP(即使在make clean之后)重新安装了该库,然后编译并启动了我的程序,但是它从不打印“你好”。我也确定,我没有使用另一个安装的GMP库(当我做make uninstall我的程序无法编译,因为它找不到库)。不过,我坚持要求gcc使用-L选项在GMP源文件夹中查找库。

我不知道我做错了什么:(

+1

为什么要混合使用'--disable-shared --enable-shared'? – Eregrith 2012-04-24 08:20:22

+0

对不起,这是一个错字。我重新编辑了这篇文章。谢谢! – 2012-04-24 08:23:24

+0

我对GMP库不太熟悉,但是你是不是在调用TRACE()函数呢? 'ltrace'显示你的可执行程序调用的库调用。 TRACE()是GMP中的一个lib函数,你的'a.out'调用了吗? – 2012-04-24 09:18:24

回答

0

你的a.out的最终编译没有产生a.out可执行文件静态链接。因此,即使你的状态,编译期间program.c正在使用您的GMP库的编译器,在运行时它的地方捡了共享库,您需要做两件事情之一:

  1. 编译以-Bstatic(或类似的东西;检查手册页。你的编译器)
  2. 设置LD_LIBRARY_PATH(或类似的东西;检查'ld'或'dyld'手册页)

我认为#1实际上是您唯一的选择,因为您仅构建了GMP的静态版本。对于#1,请确保在编译过程中明确提供了-L/path/to/gmplib。

+0

基本上,我最终做了'gcc program.c -lgmp -L/path/to/gmp',然后工作。我可以在gmp库中执行printfs,重新编译并调试。不过,我觉得这样做有点麻烦。它工作,但用gdb调试会更好,我猜。 – 2012-04-26 07:44:08

+0

所以最初的问题解决了,因为你正在编辑适当的GMP库,并且看到你对GMP的编辑。现在你有另一个问题,调试器不起作用?你是否在使用GDB和'-d'选项来告诉GDB在哪里搜索源代码文件?像'gdb -d/path/to/gmpsrc a.out' – GoZoner 2012-04-26 13:23:33