我有一个x86 asm程序,它将小写字母转换为大写。我在汇编pdf中找到了它并正在玩它来学习。该程序可以像这样调用
./ uppercaser> in.txt< out.txt
我正在尝试添加某种形式的错误检查作为练习,正如你可以想象的那样,像我这样的新手,它并不顺利。我想在调试器中运行程序以查看发生了什么,但是在EDB中运行它不起作用,因为程序需要输入。我已经用谷歌搜索了如何做到这一点,显然
edb --run ./uppercaser> in.txt< out.txt
应该这样做,但是当我运行它时,程序在几条指令之后无法继续在调试器中执行,就像我在没有输入的情况下运行它时那样。那么我该如何实现呢?
我意识到对组装和调试非常新,我可能只是对事情的工作方式有一个基本的误解,但我假设程序在几条指令之后停止进入调试器,因为它正在等待输入而没有得到任何指令。
感谢阅读。
答案 0 :(得分:1)
我尚未对输入+输出进行测试,但是如果您需要使用输入文件,则可以构建某种类型的python“包装器”作为单层。为我工作,也许并不漂亮,但可以满足我的意图:
python -c 'from time import sleep;sleep(20);a=open("input","r";content=a.read();print(content);a.close;'|./myapp
您现在有20秒的时间运行并附加edb。您可以根据需要更改睡眠计时器。 在另一个终端中,您可能想要运行类似
edb --attach $(pidof myapp)
答案 1 :(得分:1)
方法1
EDB中有一个运行按钮,您必须单击两次,然后I / O终端将打开。另外,您运行edb的窗口将显示TTY流的位置。 ] 1
方法2
如果要将二进制“ uppercaser”的I / O重定向到网络端口,则可以使用netcat工具(nc)进行类似的操作
您可以将90替换为系统上的任何其他空闲端口。
这两种方法都对我有效。如果您正在做某种测试,我建议您使用第二种方法
答案 2 :(得分:0)
edb 不让这很容易。遗憾的是,它甚至可能是不可能的(除了修改edb。它是开源的。)
如果您可以在程序执行任何操作之前暂停程序,则可以附加到已经运行的进程,而不是启动xterm。
edb将arg带到--run
并运行它重定向到edb也开始的xterm的tty。
我尝试了一些事情,包括
edb --run ./a.out '<in.txt'
它只是在命令行上运行带有<in.txt
的命令。调试程序的stdin来自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重定向到它。