【发布时间】:2015-05-18 16:38:39
【问题描述】:
编辑:GDB 不是问题。我的代码中的错误导致了这种行为。
我想知道 GDB 的输入是如何工作的。
例如我创建了以下小c程序:
#include <stdlib.h>
#include <stdio.h>
int main(){
setbuf(stdout,NULL);
printf("first:\n");
char *inp;
size_t k = 0;
getline(&inp, &k, stdin);
printf("%s",inp);
free(inp);
// read buffer overflow
printf("second:\n");
char buf[0x101];
read(fileno(stdin),buf,0x100);
printf("%s",buf);
printf("finished\n");
}
它从标准输入读取两次字符串并打印它的回显。
为了自动阅读,我创建了以下 python 代码:
python3 -c 'import sys,time; l1 = b"aaaa\n"; l2 = b"bbbb\n"; sys.stdout.buffer.write(l1); sys.stdout.buffer.flush(); time.sleep(1); sys.stdout.buffer.write(l2); sys.stdout.buffer.flush();'
运行 c 程序可以正常工作。使用 python 输入运行 c 程序也可以正常运行:
python-snippet-above | ./c-program
在没有输入文件的情况下运行 gdb,在请求时键入字符串,似乎也很好。
但是在gdb中使用输入文件时,恐怕我错误地使用了调试器。 通过教程和 stackoverflow 帖子,我知道 gdb 可以通过文件获取输入。
所以我尝试了:
& python-snippet > in
& gdb ./c-program
run < in
我预计 gdb 将用于第一次读取文件的第一行,第二次读取第二行。
in 看起来像(由于 python 代码):
aaaa
bbbb
而是 gdb 打印:
(gdb) r < in
Starting program: /home/user/tmp/stackoverflow/test < in
first:
aaaa
second:
finished
[Inferior 1 (process 24635) exited with code 011]
在 read(fileno(stdin),buf,0x100) 之后观察变量 buf 告诉我:
(gdb) print buf
$1 = 0x0
所以我假设我的第二个输入 (bbbb) 丢失了。如何在 gdb 中使用多个输入?
感谢阅读:)
【问题讨论】: