2012-06-18 4 views
3

Я в настоящее время следую this video о том, как работать с сборкой и gdb, используя this C program, но у меня проблема. Вот что мне делать, чтобы компилировать и отлаживать:gdb не принимает вход пользователя

[email protected]:~/assem$ gcc -ggdb -o SimpleDemo SimpleDemo.c 
[email protected]:~/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 

Теперь откуда я «демо» набрали в конце концов, это то, где программа должна быть принимать пользовательский ввод. Но когда я нажимаю return после ввода ввода, ничего не происходит. Я не могу ctrl + c из программы, ничего не могу сделать. В итоге мне приходится убивать процесс с другой сессии, чтобы я мог получить контроль. Любые идеи, почему gdb делает это, или что я могу делать неправильно?

Спасибо!

+0

Я считаю, что это правильно, потому что название программы, как правило, ARGV [0]. Это странная конвенция C. – squiguy

+0

Вы пытались использовать GDB для перехода через программу, чтобы увидеть, где ее повесили? –

+0

@VanDarg - Нет, просто потому, что он работает в видео, и я следил за всем персонажем по характеру. – Chiggins

ответ

0

Вы пытаетесь ввести пользователя во время программы? Если вы просто хотите установить аргументы командной строки в начале, вы можете просто указать set args ... где вы можете дать аргументы так же, как и во время программы.

+0

Программа принимает аргументы командной строки, поэтому в моей команде запуска I имеют «10 20» в конце. Я считаю, что у парня, делающего видео, есть причина для get() и puts() в коде, который будет объяснен в будущем видео, поэтому я бы не хотел, чтобы это было в аргументах. – Chiggins

+0

Перед тем, как набрать run, попробуйте ввести набор args 10 20. Это может быть полезно также: http://www.delorie.com/gnu/docs/gdb/gdb_19.html – squiguy

+0

Я пробовал это, те же результаты. – Chiggins

0

Вы пробовали это?

gdb --args ./SimpleDemo 10 20 
1

Я не уверен, почему это не работает для вас; он работает так, как ожидалось здесь ...

Тем не менее, мне легче запускать программы, выполняющие интерактивный ввод-вывод в отдельном терминале, и, возможно, это поможет вам.

В одном терминале,

 
$ gdbserver --multi localhost:4242 
listening on port 4242 

и в другом,

 
$ gdb ./SimpleDemo 
(gdb) target extended-remote localhost:4242 
Remote debugging using localhost:4242 
(gdb) run 10 20 

Назад к терминалу работает gdbserver,

 
Remote debugging from host 127.0.0.1 
Process ./SimpleDemo created; pid=PID 
demo 
demo 
Sum of 10+20 = 30 

Child exited with status 0 
Смежные вопросы