I was asked how to let a gdb controlled slave read from stdin, and couldn’t remember how it was done, so I wrote the following little test program, figuring that muscle memory would remind me once I had gdb running.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int main() { size_t rc = 0; char buf[2]; do { rc = fread ( buf, 1, 1, stdin ); if ( rc == 1 ) { printf ( "%c\n" , buf[0] ); } } while ( rc ); return 0; } |
Turns out the answer is just the gdb run command, which can specify stdin for the program. Here’s a demo session that shows this in action
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | (gdb) b main Breakpoint 1 at 0x40061e: file x.c, line 5. (gdb) run < x.c Starting program: /home/pjoot/tmp/readit/a.out < x.c Breakpoint 1, main () at x.c:5 5 size_t rc = 0; Missing separate debuginfos, use: yum debuginfo-install glibc-2.28-225.0.4.el8_8.6.x86_64 (gdb) n 9 rc = fread ( buf, 1, 1, stdin ); (gdb) n 10 if ( rc == 1 ) { (gdb) p rc $1 = 1 (gdb) p buf[0] $2 = 35 '#' (gdb) n 11 printf ( "%c\n" , buf[0] ); (gdb) # 13 } while ( rc ); (gdb) 9 rc = fread ( buf, 1, 1, stdin ); (gdb) 10 if ( rc == 1 ) { (gdb) p rc $3 = 1 (gdb) p buf[0] $4 = 105 'i' |
The x.c input that I passed to run, was the source of the program that I debugging.