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,

Другие вопросы по тегам