ejeker 发表于 2013-07-19 16:37

gdb用attach的方法,如何给调用scanf的程序一个输入?

一个最简单的用scanf的程序:
#include<stdio.h>
int main(void){
        int i;
        scanf("%d",&i);
        return 0;
}
编译运行之,如果我直接gdb a.out,那么可以在gdb里面给予标准输入。

但是我现在是想a.out先执行,不做输入,用ps -ef来查找a.out的进程id(例如8783),然后在一个新的窗口里面启动gdb:
# gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
.......一堆文字
(gdb) attach 8783
Attaching to process 8783
Reading symbols ...又一堆文字
0x00f45424 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.i686 libgcc-4.4.6-4.el6.i686 libstdc++-4.4.6-4.el6.i686
(gdb) bt
#00x00f45424 in __kernel_vsyscall ()
#10x00891ac3 in __read_nocancel () from /lib/libc.so.6
#20x0082d61b in _IO_new_file_underflow () from /lib/libc.so.6
#30x0082f33b in _IO_default_uflow_internal () from /lib/libc.so.6
#40x0083094a in __uflow () from /lib/libc.so.6
#50x00818653 in _IO_vfscanf_internal () from /lib/libc.so.6
#60x0081ed98 in scanf () from /lib/libc.so.6
#70x08048491 in main ()
(gdb) r
The program being debugged has been started already.
问题: 我能否在这个gdb的对话中给予a.out一个数字的输入呢,就像我用gdb a.out直接运行一样。
谢谢。

myworkstation 发表于 2013-07-19 16:37

回复 9# ejeker


    和权限有关吗?用sudo 或 用root帐号试试

myworkstation 发表于 2013-07-19 16:51

使用tty命令重定向输入输出或者运行gdb时使用-tty选项.

ejeker 发表于 2013-07-19 17:19

myworkstation 发表于 2013-07-19 16:51 static/image/common/back.gif
使用tty命令重定向输入输出或者运行gdb时使用-tty选项.

我现在是这样的,还不太成功:
在第一个终端里面启动a.out
# tty
/dev/pts/41
# ./a.out
然后在第二个终端里面:
# ps -ef|grep a.out
root      9652 252090 17:14 pts/41   00:00:00 ./a.out
root      965947540 17:15 pts/42   00:00:00 grep a.out
# gdb
......
(gdb) attach 9652
Attaching to process 9652
......
(gdb) tty /dev/pts/41
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) n
Program not restarted.
(gdb) cont
Continuing.
99
            #没有任何反应。本来scanf得到一个数字就应该退出的。

我的调试过程还有什么问题呢? 如何才能做成?

myworkstation 发表于 2013-07-19 18:26

回复 3# ejeker


    你是在gdb中用的tty命令吗?

井蛙夏虫 发表于 2013-07-20 01:00

回复 1# ejeker
你在启动a.out的终端输入,就可以使程序继续执行。
还有attach后应当执行c命令继续,而不是r命令。


   

ejeker 发表于 2013-07-20 18:44

myworkstation 发表于 2013-07-19 18:26 static/image/common/back.gif
回复 3# ejeker



是啊。

ejeker 发表于 2013-07-20 18:45

井蛙夏虫 发表于 2013-07-20 01:00 static/image/common/back.gif
回复 1# ejeker
你在启动a.out的终端输入,就可以使程序继续执行。
还有attach后应当执行c命令继续,而不 ...

我的问题是: 我能在gdb里面去给程序予输入么?

myworkstation 发表于 2013-07-20 22:24

回复 4# myworkstation


    之前我的理解有点问题,tty命令只能重定向run的程序,而attach的程序只是continue,所以重定向就不起作用了。如果只是在linux下用的话可以试试这个工具reptyr,如果没有的话可以安装一下 https://github.com/nelhage/reptyr,然后在gdb中使用命令shell reptyr PID 把PID指定的进程的终端重定向到当前终端,我现在没Linux环境不能试。你试试看。

ejeker 发表于 2013-07-22 09:28

myworkstation 发表于 2013-07-20 22:24 static/image/common/back.gif
回复 4# myworkstation



我按照你的提示,下载了这个软件,make并make install,用which命令能看到了。
然后再次运行我的程序,用gdb调试,输入你说的shell reptyr ,有问题:

# pgrep a.out
3681
# gdb a.out 3681
......一堆文字
0x003ec424 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.i686 libgcc-4.4.6-4.el6.i686 libstdc++-4.4.6-4.el6.i686
(gdb) shell reptyr 3681
Unable to attach to pid 3681: Operation not permitted
这个Operation not permitted到底是什么含义?
页: [1] 2
查看完整版本: gdb用attach的方法,如何给调用scanf的程序一个输入?