如何传递参数并将stdin从文件重定向到程序在gdb中运行?

问题描述 投票:207回答:5

我经常运行一个程序:

./a.out arg1 arg2 <file

我想用gdb调试它。

我知道set args功能,但只能从gdb提示符。

c++ debugging gdb
5个回答
1
投票

在项目上启动GDB。

  1. 转到项目目录,您已经编译了项目可执行文件。发出命令gdb和可执行文件的名称,如下所示: gdb projectExecutablename

这将启动gdb,打印以下内容:GNU gdb(Ubuntu 7.11.1-0ubuntu1~16.04)7.11.1版权所有(C)2016 Free Software Foundation,Inc。............... ..................................键入“apropos word”以搜索与“word”相关的命令。从projectExecutablename中读取符号...完成。 (GDB)

  1. 在开始运行程序之前,您需要设置断点。 break命令允许您这样做。要在名为main的函数的开头设置断点: (gdb)b主要
  2. 一旦有了(gdb)提示符,run命令就会启动可执行文件的运行。如果要调试的程序需要任何命令行参数,请将它们指定给run命令。如果您想在“xfiles”文件(位于项目目录中的“mulder”文件夹中)上运行我的程序,您将执行以下操作: (gdb)r mulder / xfiles

希望这可以帮助。

免责声明:这个解决方案不是我的,它改编自https://web.stanford.edu/class/cs107/guide_gdb.html这个简短的gdb指南很可能是在斯坦福大学开发的。


0
投票

在任何命令前键入debug以便能够在shell级别使用gdb进行调试,这不是很好吗?

下面是这个功能。它甚至可以使用以下内容:

"$program" "$@" < <(in) 1> >(out) 2> >(two) 3> >(three)

这是一个调用,你无法控制任何东西,一切都是变量,可以包含空格,换行符和shell元字符。在这个例子中,inouttwothree是消耗或产生不得损害的数据的任意其他命令。

以下bash函数在这样的环境中几乎干净地调用gdb [Gist]:

debug()
{
  1000<&0 1001>&1 1002>&2 \
  0</dev/tty 1>/dev/tty 2>&0 \
  /usr/bin/gdb -q -nx -nw \
  -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\"" exec' \
  -ex r \
  --args "$@";
}

如何应用此示例:只需在前面键入debug

之前:

p=($'\n' $'I\'am\'evil' "  yay  ")
"b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

后:

p=($'\n' $'I\'am\'evil' "  yay  ")
debug "b u g" "${p[@]}" < <(in) 1> >(out) 2> >(two) 3> >(three)

而已。现在用gdb进行调试是绝对明智的。除了一些细节或更多:

  • gdb不会自动退出,因此保持IO重定向打开,直到您退出gdb。但我称这是一个功能。
  • 你不能像argv0那样轻松地将exec -a arg0 command args传递给程序。以下应该这样做:在exec-wrapper"exec改为"exec -a \"\${DEBUG_ARG0:-\$1}\"之后。
  • 有1000以上的FD开放,通常是关闭的。如果这是一个问题,请将0<&1000 1>&1001 2>&1002更改为读取0<&1000 1>&1001 2>&1002 1000<&- 1001>&- 1002>&-
  • 您不能并行运行两个调试器。如果其他命令消耗/dev/tty(或STDIN),也可能存在问题。要解决这个问题,请将/dev/tty替换为"${DEBUGTTY:-/dev/tty}"。在其他一些TTY类型tty; sleep inf然后使用打印的TTY(即E. /dev/pts/60)进行调试,如DEBUGTTY=/dev/pts/60 debug command arg..。那就是Shell的力量,习惯它!

功能说明:

  • 1000<&0 1001>&1 1002>&2移走前3个FD 这假设FDs 1000,1001和1002是免费的
  • 0</dev/tty 1>/dev/tty 2>&0恢复前3个FD指向您当前的TTY。所以你可以控制gdb
  • /usr/bin/gdb -q -nx -nw运行gdb在shell上调用gdb
  • -ex 'set exec-wrapper /bin/bash -c "exec 0<&1000 1>&1001 2>&1002 \"\$@\""创建了一个启动包装器,它可以恢复保存到1000及以上的前3个FD
  • -ex r使用exec-wrapper启动程序
  • --args "$@"传递了给定的论点

那不容易吗?

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