我有一个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重定向到它。

08-15 23:45