【发布时间】: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 中)?