【问题标题】:gdb and valgrind within a makefile生成文件中的 gdb 和 valgrind
【发布时间】:2011-09-18 05:41:57
【问题描述】:

我有一个非常基本的问题。我确实像这里http://www.cs.cmu.edu/~gilpin/tutorial/ 一样环顾四周,但仍然怀疑..

考虑以下makefile(在上一个问题中也给出过)

all: clients.so simulator backup  
   LD_PRELOAD=/home/Juggler/client/clients.so ./simulator  
backup: backup.c libclient.a
   gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl 
simulator: simulator.c libclient.a     
   gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread
libclient.a: libclient.o client.o     
   ar rcs libclient.a libclient.o client.o 
libclient.o:libclient.c
   gcc -c libclient.c -o libclient.o -pthread  
clients.so: client.o client_invoke.o     
   ld -shared -o clients.so client_invoke.o client.o -ldl 
client_invoke.o: client_invoke.c     
   gcc -Wall -fPIC -DPIC -c -g client_invoke.c 
client.o: client.c
   gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread 

我应该做什么/改变以使用 gdb 或 valgrind 进行调试。实际上,我在做 make 时遇到了分段错误并想调试。但我从未在 makefile 中使用过 gdb 或 valgrind

谢谢

【问题讨论】:

    标签: c linux makefile gdb valgrind


    【解决方案1】:

    我对您的演示文稿做了一个小修改。你原来写的

    client.o: client.c     gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread 
    

    你能不能把它改成新的形式,看看是否会产生段错误?

    【讨论】:

    • :-( 没有帮助。这可能只是我在您编辑的问题中的输入错误
    【解决方案2】:

    通常我会做以下事情:

       $(DEBUGGER) ./simulator
    

    然后

    $ make DEBUGGER=gdb --args
    $ make DEBUGGER=valgrind
    $ make # should still work without the debugger.
    

    (从技术上讲,命令不需要 --args,但如果您将来向模拟器添加参数。)

    但使用 LD_PRELOAD 会使这复杂化,因为您可能不希望 gdb 加载 libclient

       gdb -ex 'set env LD_PRELOAD=/home/Juggler/client/clients.so' -ex 'run' ./simulator
    

    此外,通过 gcc -shared -o client.so 通过 gcc 链接共享库是正常的

    【讨论】:

    • 似乎无法正常工作...仍然出现分段错误,但没有 gdb 的帮助
    • 没有考虑 LD_PRELOAD,我不确定 gdb 是否支持通过 `gdb LD_PRELOAD=... ./simulator' 设置环境变量,无论如何将 LD_PRELOAD 设置为 gdb 命令可能不是一个好主意,虽然它应该传递给“模拟器”命令。
    【解决方案3】:

    一种不优雅的方法是通过 makefile 生成进程,然后在另一个终端中使用 GDB 附加到它。使用linux: suspend process at startup 中的技巧,您可以启动进程并使其立即挂起,然后连接 gdb。

    有一个名为 launch.sh 的脚本: #!/bin/bash

    echo "Pid is $$"
    echo -n "Press Enter.." 
    read 
    exec $@
    

    有一个像这样的 makefile 配方:

    whatever_target: whatever_deps
            ./launch.sh PROGRAM [ARGS]
    

    如果由于某种原因您看不到输出(例如,如果您正在重定向),您仍然可以通过 ps -ef 或其他方式获取 PID。然后使用 gdb:

    gdb PROGRAM_NAME PID
    

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 2020-10-02
      相关资源
      最近更新 更多