Як завантажити програму читання stdin та прийняття параметрів у gdb?


101

У мене є програма, яка приймає дані від stdin, а також приймає деякі параметри з командного рядка. Це виглядає приблизно так:

cat input.txt > myprogram -path "/home/user/work"

Я намагаюся налагодити код з gdb всередині emacs, Mx gdb, я намагаюся завантажити програму командою:

gdb cat input.txt > myprogram -path "/home/user/work"

Однак gdb це не любить.

Питання накинуте звідси . На жаль, я не розумію рішення і не впевнений, що робити за межами компіляції з -gпараметром та запуску команди Mx gdb.

Відповіді:


132

Якщо ви робили це з оболонки, ви зробили б це так:

% gdb myprogram
gdb> run params ... < input.txt

Це, здається, працює і в emacs.


Здається, перенаправлення працює, але я отримую деякі помилки. Не вдалося прочитати дійсне зображення об’єктного файлу з пам'яті. Програма вийшла з кодом 042. Будь-які ідеї?
vinc456

Це, мабуть, загальна помилка GDB, і, ймовірно, нічого спільного з тим, що ви працюєте в emacs. Дізнайтеся, як запустити GDB спочатку з оболонки (з новим запитанням, якщо потрібно), а потім переживайте про те, як запустити її всередині emacs.
Альнітак

1
Я зрозумів це. Чомусь я набрав void main (int argc, char * argv []) замість "int main ...", і це ковзало моєму оці. У будь-якому випадку все працює нормально; спасибі за вашу допомогу!
vinc456

2
Запізніле спасибі - посібник з gdb - це біль у задній частині, щоб копати.
Видалено

1
У Windows з допомогою msys64 я <і в input.txtякості argvаргументів моєї програми :( Я буду копатися відповіді на ці питання з моїм БГДОМ 8.2.1: stackoverflow.com/questions/3544325 / ...
ixe013

32

Існує кілька способів зробити це:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

або

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

або

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

де команда gdb run( r) використовує за замовчуванням аргументи, як встановлено раніше set args.


4
Коли я пробую це з gdb у cygwin, це не працює. Команда "show args" показує, що я ввійшов до потрібних аргументів, але коли я запускаю програму з "r", програма чекає, поки я наберу матеріал, а не читати із вказаного файлу.
космічний чоловік Кардіфф

1
@cardiffspaceman, ну я не можу перевірити це на Cygwin - можливо, їх версія gdb якось обмежена
maxschlepzig

Чому б просто не gdb -ex 'r -path /home/user/work < input.txt' myprogramв третьому варіанті?
Руслан

@Ruslan, працює також - використовуючи "встановити аргументи ..." просто дає можливість інтерактивно визначити деякі точки перерви тощо перед запуском програми
maxschlepzig

Щоправда, але ви також можете встановити точку розриву неінтерактивно, наприклад gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Руслан

6

Для повноти після запуску сеансу налагодження також є опція --args. тобто)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
Як би ви переспрямовували input.txt як вхід до вашої програми при запуску такого сеансу налагодження?
Peter Ajtai

1
@Peter:gdb --args yourprog.out input.txt
Бен Елгар

1
Це працює лише в тому випадку, якщо "yourprog" очікує, що ім'я файлу задасть вхід, а не перенаправлення вводу.
Альнітак

0

І якщо вам не потрібно налагоджувати з самого початку, ви також можете приєднатися до вже запущеного процесу, використовуючи:

$ gdb myprogram xxx

де xxx - ідентифікатор процесу. Тоді не потрібно вказувати gdb вихідні аргументи.


4
Ви пропустили відповідь на назву питання в частині "читання stdin". Я б де-небудь зробив хороший коментар, якби він був коротшим.
Notinlist
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.