【发布时间】:2018-01-09 09:27:39
【问题描述】:
读取宏:
%macro read 2
mov rax, 0
mov rdi, 0
mov rsi, %1
mov rdx, %2 i
syscall
%endmacro
编写宏:
%macro write 2
mov rax, 1
mov rdi, 0
mov rsi, %1
mov rdx, %2
syscall
%endmacro
我正在尝试使用 kdbg 测试我的程序,但我不确定如何输入内容,因为 kdbg 甚至没有提示我这样做,并且在我尝试编写时转到输出窗口stdout 的某些内容没有显示,查看我的输出或从stddin 输入内容的正确方法是什么?
【问题讨论】:
-
对于写入,
stdout是文件描述符 1,而不是 0。使用strace查看您实际执行的系统调用。在您担心kdbg以及它如何设置终端仿真器并将程序的输入/输出连接到它之前,请确保它在调试器之外工作。例如你确定你传递的是一个指向read/write的指针,而不是一个值吗? -
根据您的建议,它在终端中运行良好,但不确定如何调试程序
-
在终端中,FD 0 连接到 TTY,因此它可能可以写入。但如果有管道,写入 FD 0 将无法正常工作。使用
strace,使用调试器查看rax中syscall之后的返回值。 -
另外,当您的程序在
kdbg下运行时,运行(在另一个终端中)ls -l /proc/PID/fd(其中 PID 是您的进程的 pid,而不是 kdbg)。这会让你看到标准输入和标准输出是否连接到伪终端。