如何追踪或调试GMP?

时间:2012-04-24 08:18:51

标签: c debugging macros trace gmp

我已经下载了GMP库5.02的源代码,并且 - 为了最大程度的可调试性而建议here - 我跑了:

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

并使用make编译它,然后使用make install安装库。然后我编译了我的程序:gcc -lgmp -std=c99 -g -c program.c然后我跑了:ltrace ./a.out

但是我意识到ltrace根本没有调用我在源代码中找到的TRACE()函数。我想跟踪TRACE()中的内容。

我应该怎么做?或者在GMP库中有任何其他直接的调试方式吗? (我无法弄明白如何使用gdb,它从未想进入gmp_printf)

感谢。

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

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

1 个答案:

答案 0 :(得分:0)

a.out的最终编译不会产生静态链接的a.out可执行文件。所以,即使如你所述,在编译program.c期间,编译器正在使用你的GMP库,在运行时它正在某个地方挑选一个共享库。你需要做两件事之一:

  1. 使用-Bstatic(或类似的东西;编译编译器的手册页)编译
  2. 设置LD_LIBRARY_PATH(或类似的东西;检查'ld'或'dyld'手册页)
  3. 我认为#1实际上是您唯一的选择,因为您只构建了GMP的静态版本。对于#1,请确保在program.c

    的编译中明确提供-L / path / to / gmplib