Вам нужно поместить основной цикл в другой цикл, чтобы он снова запускался после выполнения функции game_over
:
# main loop
while True:
run = True
while run:
main()
game_over()
Поскольку pygame.quit()
не выходит из программы, вам потребуется вместо этого, чтобы обе петли были while run:
и имели две run = True
с, или использовали sys.exit(0)
или raise SystemExit(0)
после pygame.quit()
.
Вы также должны удалить return run
из цикла for
в функции game_over()
.
Если Вы хотите прервать записи к диапазону адресов, можно использовать mprotect()
отметить рассматриваемую память как незаписываемую, и установить использование обработчика сигналов sigaction()
для ловли получающегося SIGSEGV сделайте вход или безотносительно и отметьте страницу как записываемую снова.
GDB действительно имеет ту функцию: это называют аппаратными контрольными точками, и это очень хорошо поддерживается на Linux/x86:
(gdb) watch *(int *)0x12345678
Если Ваши сбои приложения GDB, создайте текущий GDB от Главы CVS.
Если это, которое все еще приводит к сбою GDB, регистрируют ошибку GDB.
Возможности, мы можем зафиксировать GDB быстрее, чем можно бездельничать обработчик SIGSEGV (обеспечил хороший тестовый сценарий), и прикрепляет к GDB, помогают Вам с будущими проблемами также.
То, в чем Вы нуждаетесь, является доступом к отладочным регистрам X86: http://en.wikipedia.org/wiki/Debug_register
Необходимо будет установить адрес точки останова в одном из DR0 к DR3 и затем условие (запись данных) в DR7. Прерывание произойдет, и можно выполнить код отладки, чтобы считать DR6 и найти то, что вызвало точку останова.
Если GDB не работает, Вы могли бы попробовать более простой/меньший отладчик, такой как http://sourceforge.net/projects/minibug/ - если это не работает, можно, по крайней мере, пройти код и понять, как использовать аппаратные средства отладки на процессоре сами.
Кроме того, существует большой ресурс разработчика IBM при освоении Linux, отлаживающего методы, которые должны предоставить некоторые дополнительные возможности:
http://www.ibm.com/developerworks/linux/library/l-debug/
Довольно хорошая статья о выполнении этого является окнами, здесь (я знаю, что Вы работаете на Linux, но другие могли бы приехать к этому вопросу, желающему сделать это в окнах):
http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx
- Adam