Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何跟踪或调试GMP?_C_Debugging_Macros_Trace_Gmp - Fatal编程技术网

C 如何跟踪或调试GMP?

C 如何跟踪或调试GMP?,c,debugging,macros,trace,gmp,C,Debugging,Macros,Trace,Gmp,我已经下载了GMP库5.02的源代码,为了最大程度地提高可调试性,我运行了: ./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根本没有调用我可以在源代

我已经下载了GMP库5.02的源代码,为了最大程度地提高可调试性,我运行了:

./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库(当我执行卸载时,我的程序无法编译,因为它找不到库)。尽管如此,我坚持gcc在GMP源文件夹中使用-L选项查找库


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

你对a.out的最终编译并没有生成一个静态链接的a.out可执行文件。因此,即使你说,在编译程序.c的过程中,编译器正在使用你的GMP库,但在运行时它在某处拾取一个共享库。你需要做两件事之一:

  • 使用-Bstatic编译(或类似的东西;检查编译器的手册页)
  • 设置LD_LIBRARY_路径(或类似内容;检查'LD'或'dyld'手册页)

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

    为什么要混合
    --禁用共享--启用共享
    ?抱歉,这是一个打字错误。我重新编辑了这篇文章。谢谢!我对GMP库不太熟悉,但我能做什么您的意思是“不调用
    TRACE()
    functions”?
    ltrace
    显示可执行文件调用的库调用。是
    TRACE()
    GMP中的一个lib函数,您的
    a.out
    调用它?TRACE是一个宏,但我进一步研究了我的问题,并相应地重新编辑了我的文章。基本上,我最终完成了
    gcc程序。c-lgmp-L/path/to/GMP
    ,然后它就工作了。我能够在GMP库中执行printfs,重新编译并进行调试。然而,我我觉得这样做有点麻烦。它可以工作,但我想用gdb调试会更好。所以原来的问题解决了,因为您正在[Check mark for me!]中编译正确的GMP库查看您对GMP的编辑。现在您遇到了另一个调试器无法工作的问题?您是否使用带“-d”选项的GDB来告诉GDB在哪里搜索源代码文件?例如“GDB-d/path/to/gmpsrc a.out”