Мне нужно было отладить программу асинхронно, потому что она остановилась, и Ctrl+С убитый gdb
вместо того, чтобы прерывать программу (это на MinGW / MSYS).
Кто-то намекнул тот gdb
не будет работать на Windows в асинхронном режиме, и на самом деле это не так (с Asynchronous execution not supported on this target.
сообщение), но это gdbserver
было бы.
Итак, я стараюсь:
$ gdbserver localhost:60000 ./a_.exe 0
Process ./a_.exe created; pid = 53644
Listening on port 60000
(Поставка 0
в качестве аргумента, согласно как на странице написано, что сделано.)
Затем в другом терминале:
$ gdb ./a_.exe
(gdb) target remote localhost:60000
Remote debugging using localhost:60000
0x76fa878f in ntdll!DbgBreakPoint () from C:\Windows\system32\ntdll.dll
(gdb) continue
Continuing.
[Inferior 1 (Remote target) exited with code 01]
Хотя оригинал сейчас выглядит так:
$ gdbserver localhost:60000 ./a_.exe 0
Process ./a_.exe created; pid = 53484
Listening on port 60000
Remote debugging from host 127.0.0.1
Expecting 1 argument: test case number to run.
Child exited with status 1
GDBserver exiting
То есть моя программа думала, что у нее нет аргументов.
Справочная страница не так?
Да! «Вводить в заблуждение» — более подходящий термин. (Вводит в заблуждение, по крайней мере, как это относится к этой версии gdbserver
на этой платформе.)
Первый аргумент буквально первый аргумент (argv
) дано низшему. Обычно это имя исполняемого файла. Итак, сработало следующее:
$ gdbserver localhost:60000 ./a_.exe whatever 0
То есть, руководство должно было сказать, чтобы быть последовательным:
target> gdbserver host:2345 emacs emacs foo.txt
Я не могу помочь вам с gdbserver,
но если вы просто ищете способ прервать программу, запущенную в mingw / msys gdb
(Похожий на Ctrl+С на Linux)
взглянуть на DebugBreak