LINUX.ORG.RU

Как остановить программу В gdb


0

0

Программа иногда входит в бесконечный цикл. Надо отследить этот момент и передать управление gdb.

Проблема с виндой. После Ctrl+C gdb спрашивает меня "exit anyway? (y/n)" и не принимает ответ n. Ctrl+Break убивает и программу и gdb. Завершение задачи через Task Manager убивает программу с кодом 1.

Понятия не имею как в винде можно послать процессу какой-нибудь сигнал и есть ли они там вообще.

После `handle all nostop nopass' всё происходит точно так же.

Программа имеет текстовый интерфейс (не консольный). Может быть можно перенаправить gdb на другой tty? Но работает ли это в gdb под винду?

Как мне в нужный момент приостановить программу и отлаживать её в gdb? Сильно мучаюсь.

anonymous

Ответ на: комментарий от Sphinx

Там, честно говоря, ничего нет:

'kill' is not recognized as an internal or external command, operable program or batch file.

anonymous
()

Может лучше использовать более родные дебаггеры для венды? windbg тот же или Visual Studio

Legioner ★★★★★
()

> Как мне в нужный момент приостановить программу и отлаживать её в gdb? Сильно мучаюсь.

понатыкать breakpoint-ов и запускать из gdb через run/cont локализовать участок, где циклится, и посмотреть его более подробно

не под виндой можно было бы чего-нибудь на dtrace/strace намутить, чтобы отследить такой участок

anonymous
()
Ответ на: комментарий от mint

Да, там есть tskill, но он посылает SIGTERM, и вроде бы другой сигнал послать нельзя.

Можно кстати попробовать в GDB сделать `handle SIGTERM stop nopass` (чтобы программа останавливалась, но сигнал в неё после продолжения не передавался), а дальше next/step.

Sphinx ★★☆☆
()
Ответ на: комментарий от Sphinx

handle all stop nopass. + tskill main = Program exited normally.

Облом.

anonymous
()
Ответ на: комментарий от anonymous

Проблема в том, что я не знаю где именно этот участок. Иначе мне не нужен был бы дебаггер.

anonymous
()

Попробовал прервать программу "for( ; ; ) ;" всё получилось. Выходит проблема из-за того, что программа многозадачная. Что делать?

anonymous
()
Ответ на: комментарий от anonymous

> Выходит проблема из-за того, что программа многозадачная. Что делать?

Запустить программу. Подождать пока зависнит. Запустить gdb. Приаттачится к процессу.

Тогда вроди всё должно бы замёрзнуть и используя "info threads" и "thread N" найти зависнувший поток.

stpg
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.