免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7918 | 回复: 13

[Linux] gdb用attach的方法,如何给调用scanf的程序一个输入? [复制链接]

论坛徽章:
0
发表于 2013-07-19 16:37 |显示全部楼层
10可用积分
一个最简单的用scanf的程序:

  1. #include<stdio.h>
  2. int main(void){
  3.         int i;
  4.         scanf("%d",&i);
  5.         return 0;
  6. }
复制代码
编译运行之,如果我直接gdb a.out,那么可以在gdb里面给予标准输入。

但是我现在是想a.out先执行,不做输入,用ps -ef来查找a.out的进程id(例如8783),然后在一个新的窗口里面启动gdb:

  1. # gdb
  2. GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
  3. .......一堆文字
  4. (gdb) attach 8783
  5. Attaching to process 8783
  6. Reading symbols ...又一堆文字
  7. 0x00f45424 in __kernel_vsyscall ()
  8. 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
  9. (gdb) bt
  10. #0  0x00f45424 in __kernel_vsyscall ()
  11. #1  0x00891ac3 in __read_nocancel () from /lib/libc.so.6
  12. #2  0x0082d61b in _IO_new_file_underflow () from /lib/libc.so.6
  13. #3  0x0082f33b in _IO_default_uflow_internal () from /lib/libc.so.6
  14. #4  0x0083094a in __uflow () from /lib/libc.so.6
  15. #5  0x00818653 in _IO_vfscanf_internal () from /lib/libc.so.6
  16. #6  0x0081ed98 in scanf () from /lib/libc.so.6
  17. #7  0x08048491 in main ()
  18. (gdb) r
  19. The program being debugged has been started already.
复制代码
问题: 我能否在这个gdb的对话中给予a.out一个数字的输入呢,就像我用gdb a.out直接运行一样。
谢谢。

最佳答案

查看完整内容

回复 9# ejeker 和权限有关吗?用sudo 或 用root帐号试试

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-07-19 16:37 |显示全部楼层
回复 9# ejeker


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

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-07-19 16:51 |显示全部楼层
使用tty命令重定向输入输出或者运行gdb时使用-tty选项.

论坛徽章:
0
发表于 2013-07-19 17:19 |显示全部楼层
myworkstation 发表于 2013-07-19 16:51
使用tty命令重定向输入输出或者运行gdb时使用-tty选项.


我现在是这样的,还不太成功:
在第一个终端里面启动a.out

  1. # tty
  2. /dev/pts/41
  3. # ./a.out
复制代码
然后在第二个终端里面:

  1. # ps -ef|grep a.out
  2. root      9652 25209  0 17:14 pts/41   00:00:00 ./a.out
  3. root      9659  4754  0 17:15 pts/42   00:00:00 grep a.out
  4. [root@dhcp-10-35-12-184 ~]# gdb
  5. ......
  6. (gdb) attach 9652
  7. Attaching to process 9652
  8. ......
  9. (gdb) tty /dev/pts/41
  10. (gdb) r
  11. The program being debugged has been started already.
  12. Start it from the beginning? (y or n) n
  13. Program not restarted.
  14. (gdb) cont
  15. Continuing.
  16. 99
  17.               #没有任何反应。本来scanf得到一个数字就应该退出的。

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

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-07-19 18:26 |显示全部楼层
回复 3# ejeker


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

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
发表于 2013-07-20 01:00 |显示全部楼层
回复 1# ejeker
你在启动a.out的终端输入,就可以使程序继续执行。
还有attach后应当执行c命令继续,而不是r命令。


   

论坛徽章:
0
发表于 2013-07-20 18:44 |显示全部楼层
myworkstation 发表于 2013-07-19 18:26
回复 3# ejeker

是啊。

论坛徽章:
0
发表于 2013-07-20 18:45 |显示全部楼层
井蛙夏虫 发表于 2013-07-20 01:00
回复 1# ejeker
你在启动a.out的终端输入,就可以使程序继续执行。
还有attach后应当执行c命令继续,而不 ...


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

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
发表于 2013-07-20 22:24 |显示全部楼层
回复 4# myworkstation


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

论坛徽章:
0
发表于 2013-07-22 09:28 |显示全部楼层
myworkstation 发表于 2013-07-20 22:24
回复 4# myworkstation

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

  3. # pgrep a.out
  4. 3681
  5. # gdb a.out 3681
  6. ......一堆文字
  7. 0x003ec424 in __kernel_vsyscall ()
  8. 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
  9. (gdb) shell reptyr 3681
  10. Unable to attach to pid 3681: Operation not permitted
复制代码
这个Operation not permitted到底是什么含义?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP