gdb.execute блокирует все потоки в скриптах Python
Я пишу GDB с Python 2.7.
Я просто пошаговый инструкции с gdb.execute("stepi")
, Если отлаженная программа находится в режиме ожидания и ожидает взаимодействия с пользователем, gdb.execute("stepi")
не возвращается Если есть такая ситуация, я хочу остановить сеанс отладки без завершения GDB.
Для этого я создаю поток, который убивает отлаженный процесс, если текущая инструкция выполнялась более x секунд:
from ctypes import c_ulonglong, c_bool
from os import kill
from threading import Thread
from time import sleep
import signal
# We need mutable primitives in order to update them in the thread
it = c_ulonglong(0) # Instructions counter
program_exited = c_bool(False)
t = Thread(target=check_for_idle, args=(pid,it,program_exited))
t.start()
while not program_exited.value:
gdb.execute("si") # Step instruction
it.value += 1
# Threaded function that will kill the loaded program if it's idling
def check_for_idle(pid, it, program_exited):
delta_max = 0.1 # Max delay between 2 instructions, seconds
while not program_exited.value:
it_prev = c_ulonglong(it.value) # Previous value of instructions counter
sleep(delta_max)
# If previous instruction lasted for more than 'delta_max', kill debugged process
if (it_prev.value == it.value):
# Process pid has been retrieved before
kill(pid, signal.SIGTERM)
program_exited.value = True
print("idle_process_end")
Тем не мение, gdb.execute
приостанавливает мой поток... Есть ли другой способ убить отлаженный процесс, если он простаивает?
1 ответ
Тем не менее, gdb.execute приостанавливает мой поток
Что здесь происходит, так это gdb.execute
не освобождает глобальную блокировку Python при вызове gdb. Таким образом, пока выполняется команда gdb, другие потоки Python застряли.
Это просто недосмотр в GDB. Я подал ошибку для этого.
Есть ли другой способ убить отлаженный процесс, если он простаивает?
Есть еще одна техника, которую вы можете попробовать - я не уверен, что она будет работать. К сожалению, эта часть GDB не полностью реализована (в настоящее время); так что не стесняйтесь подавать отчеты об ошибках.
Основная идея - запускать команды gdb в основном потоке, но не из Python. Итак, попробуйте написать свой пошаговый цикл с помощью интерфейса командной строки GDB, например:
(gdb) while 1
> stepi
> end
Тогда ваша тема должна быть в состоянии kill
низший Другой подход может быть для вашего потока, чтобы ввести команду GDB в основной цикл с помощью gdb.post_event
,