Переход в swapcontext () с помощью GDB - PullRequest
4 голосов
/ 03 сентября 2011

Я делаю проект, который делает системные вызовы Unix. Чтобы быть конкретным, мой проект сильно зависит от вызовов getcontext (), makecontext (), swapcontext () и setcontext (). Я попытался отладить свой код с помощью GDB. Я построчно входил в код и проверял элемент управления, но после вызова swapcontext () он больше не входит в код. Вместо этого отладка практически останавливается, и остальная часть программы запускается автоматически, а не построчно. Я думаю, GDB не входит в контекстные вызовы? Есть ли способ обойти это? Есть ли отладчик, который я могу использовать для этого? Спасибо

Ответы [ 5 ]

1 голос
/ 03 сентября 2011

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

0 голосов
/ 15 октября 2014

Вы можете многократно использовать команду GDB stepi, чтобы сначала войти, а затем выполнить функцию swapcontext(). Вы должны выполнить несколько десятков раз, в том числе несколько шагов по системным вызовам ядра - я полагаю, чтобы сохранить состояние с плавающей запятой? Это немного отнимает много времени, но это работает.

0 голосов
/ 07 марта 2013

Переход с помощью GDB на вызовы swapcontext () с помощью 'step' или 'next' не работает, потому что не только изменяется указатель стека, но и вызов возвращается к другой строке кода (что является желаемым эффектом swapcontext ()) , Поскольку GDB ставит точку останова в следующей строке кода, которая не будет выполняться, пока другой swapcontext () не вернется в это место, выполнение не прервется.

Вам нужно предусмотреть строку, к которой вернется swapcontext (), и установить там точку останова. Для нового (неиспользованного) контекста это будет строка, которую вы указали в качестве функции входа. Для используемых контекстов это будет, вероятно, одна из строк после swapcontext () там ...

0 голосов
/ 03 сентября 2011

GDB проходит через один поток и называет это текущим потоком. Другие потоки будут работать, как вы делаете это. Если вы установите точку останова, которая получает удар в потоке, отличном от текущего, то GDB изменит текущий поток на этот поток. Степпинг теперь относительно нового текущего потока.

0 голосов
/ 03 сентября 2011

Как бы вам ни понравился этот ответ, лучше всего шагать по коду маленькими кусочками вручную . Многопоточные программы не очень хорошо работают с отладчиками, такими как GDB и Valgrind (по крайней мере, по моему опыту), и большинство ошибок можно определить путем тщательного пошагового ручного анализа кода.

...