我有一个x86 asm程序,可以将小写字母转换为大写字母。我在组装pdf文件中找到了它,并且一直在学习它。可以像这样调用程序
./uppercaser > in.txt < out.txt
我正在尝试添加某种形式的错误检查作为练习,并且您可以想象对于像我这样的新手,它进行得并不顺利。我想在调试器中运行该程序以查看发生了什么,但是按原样在EDB中运行它不起作用,因为该程序需要输入。我已经用谷歌搜索了如何做到这一点,显然
edb --run ./uppercaser > in.txt < out.txt
本来可以做到的,但是当我像这样运行它时,程序在经过几条指令后仍无法在调试器中继续执行,就像我在没有输入的情况下运行时一样。那么我该如何实现呢?
我意识到,对于组装和调试非常陌生,我可能会对工作原理产生根本性的误解,但是我假设程序在经过几条指令后便停止进入调试器,因为它正在等待输入而没有得到任何输入。
最佳答案
edb并不容易做到。不幸的是,它甚至可能是不可能的(除了修改edb。它是开源的)。
如果您可以在程序执行任何操作之前将其暂停,则可以在任何终端中将其附加到已在运行的进程中,而不用启动新的xterm。
如果要将数据通过管道传输到流程中,则可以使用命名管道。例如
mkfifo mypipe
./testprog < mypipe & # or not in the background
# tab over to EDB and attach to testprog
(echo ...; cat - ) > mypipe # in a different terminal if you want
显然,可以使用要写入管道的任何内容(例如
cat file
或perl或python单行代码)来生成一些数据。退出后,testprog
的读取系统调用可能会在stdin上获得EOF。这就是为什么我使用一个带有一个重定向的子外壳的原因,该外壳在echo和stdin的cat
之间保持打开状态。edb将arg带到
--run
并运行它,将其重定向到xterm的tty中,后者也开始。我尝试了几件事,包括
edb --run ./a.out '<in.txt'
只需在命令行上使用
<in.txt
运行命令。调试程序的标准输入来自xterm。 Edb显然没有涉及shell,因此您不能使用shell元字符。edb的命令行输出(在运行它的终端中,而不是在打开的xterm上)包括:
Running Terminal: "/usr/bin/xterm"
Terminal Args: ("-title", "edb output", "-hold", "-e", "sh", "-c", "tty > /tmp/edb_temp_file_138942160_7753;trap "" INT QUIT TSTP;exec<&-; exec>&-;while :; do sleep 3600; done")
/tmp/edb_...
文件不存在。我猜edb只是读取它来找出xterm的tty的路径,然后将命令stdin / out重定向到它。