【问题标题】:gdb won't accept user inputgdb 不接受用户输入
【发布时间】:2012-06-18 18:56:43
【问题描述】:

我目前正在关注this video,了解如何使用 this C program 处理程序集和 gdb,但我遇到了问题。下面是我编译和运行 gdb 的方法:

chiggins@host:~/assem$ gcc -ggdb -o SimpleDemo SimpleDemo.c
chiggins@host:~/assem$ gdb ./SimpleDemo
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/chiggins/assem/SimpleDemo...done.
(gdb) list
4       int add(int x, int y)
5       {
6               int z =10;
7
8               z = x + y;
9               return z;
10      }
11
12      main(int argc, char **argv)
13      {
(gdb)
14              int a = atoi(argv[1]);
15              int b = atoi(argv[2]);
16              int c;
17              char buffer[100];
18
19              gets(buffer);
20              puts(buffer);
21
22              c = add(a,b);
23
(gdb)
24              printf("Sum of %d+%d = %d\n",a, b, c);
25
26              exit(0);
27
28      }
(gdb) run 10 20
Starting program: /home/chiggins/assem/SimpleDemo 10 20
demo

现在我在最后输入了“演示”,这就是程序应该接受用户输入的地方。但是当我在输入回车后按回车时,什么也没有发生。我不能ctrl+c退出程序,什么也做不了。我最终不得不从另一个会话中终止该进程,这样我才能重新获得控制权。任何想法为什么 gdb 会这样做,或者我可能做错了什么?

谢谢!

【问题讨论】:

  • 我认为这是正确的,因为程序名称通常是 argv[0]。这是一个奇怪的 C 约定。
  • 您是否尝试过使用 GDB 单步执行程序以查看它挂断的位置?
  • @VanDarg - 不,只是因为它在视频中有效,而且我一直在逐个字符地跟踪所有内容。
  • @Chiggins:好吧,我会从这个开始。 GDB 是一个非常强大的调试器。在不同的位置创建断点,然后等待程序是否在那里。例如,在第 19 行和第 20 行创建断点。此外,如果不传递参数,程序是否会产生相同的结果?程序是否直接从命令行运行(即不在 GDB 中)?

标签: c linux assembly gdb


【解决方案1】:

我不知道为什么这对你不起作用;它在这里按预期工作......

不过,我发现在单独的终端中运行执行交互式 I/O 的程序更容易,也许它会对您有所帮助。

在一个终端中,

$ gdbserver --multi localhost:4242 监听 4242 端口

在另一个方面,

$ gdb ./SimpleDemo (gdb) 目标扩展远程 localhost:4242 使用 localhost:4242 进行远程调试 (gdb) 运行 10 20

回到运行gdbserver的终端,

从主机 127.0.0.1 远程调试 处理 ./SimpleDemo 创建; pid=PID 演示 演示 10+20 之和 = 30 孩子以状态 0 退出

【讨论】:

    【解决方案2】:

    您是否尝试在程序期间进行用户输入?如果您只是想在开始时设置命令行参数,您可以说 set args ... 在这里您可以像在程序过程中一样提供参数。

    【讨论】:

    • 该程序接受命令行参数,这就是为什么在我的运行命令中我最后有一个“10 20”。我相信制作视频的人在代码中使用 gets() 和 puts() 是有原因的,这将在未来的视频中解释,所以我不希望它出现在参数中。
    • 在输入 run 之前,尝试输入 set args 10 20。这也可能有帮助:delorie.com/gnu/docs/gdb/gdb_19.html
    【解决方案3】:

    你试过了吗?

    gdb --args ./SimpleDemo 10 20
    

    【讨论】:

      【解决方案4】:

      使用 Ctrl+Enter 代替 Enter 键。

      【讨论】:

      • 为什么会有不同?在 Linux konsole (KDE) 窗口中的“cooked”模式下,control+enter 发送与未修改的 enter 相同的换行符。 (我使用来自终端的输入运行 hexdump -C。) readline 是否获得不同的原始输入?
      • 您的回答对于 X-Windows 是正确的,因为它可以看到原始键盘输入。问题是终端窗口。无法正确表示 ENTER、SHIFT-ENTER 和 CTRL-ENTER 之间的区别,因此它们都简化为 ^M。在这里阅读更多:unix.stackexchange.com/questions/536352/…
      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2016-03-17
      • 2011-01-09
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多