2015-01-12 2 views
2

Я использую gdb для связи с ASIC на основе LEON2 через домашний сервер gdb (не уверен, что этот «gdb-сервер» здесь является правильной фразой). Он работает следующим образом: клиент gdb использует обычный протокол gdb для разговора с сервером gdb, который затем переводит запросы gdb на чтение и запись с/на HW и отправляет результат клиенту, если таковой имеется. Мой клиент gdb - это sparc-rtems-gdb 6.6 в RTEMS 4.8.0 на ПК с Windows 7.Почему gdb автоматически выполняет чтение после моей запрошенной записи?

Когда я начинаю GdB клиента я запустить следующую команду, чтобы прикрепить к серверу GdB:

target extended-remote localhost:5000 

Тогда я хочу изменить слово в оперативной памяти, так что я запускать эту команду GDB:

set *((unsigned int*) 0x40000000)=2 

Во время отладки сервера gdb я вижу, что он получает следующую строку, которая ожидается и правильная в соответствии с протоколом gdb, то есть запись 4 байта, значение 2 в адрес 0x40000000:

M40000000,4:00000002 

Теперь путаница: После того, как запрос на запись выше, другой приходит запрос от клиента GDB, прочитать 4 байта из адресной 0xABD37787:

mabd37787,4 

Почему клиент GDB пытается прочитать с этого адреса? Насколько я знаю, я ничего не сделал, чтобы запросить это чтение, я только хотел выполнить запись. Если gdb прочитал бы адрес 0x40000000, например, чтобы проверить запись, все будет в порядке. Но out-of-nowhere-address 0xABD37787 не существует на моем HW, что создает проблемы для меня.

Есть ли способ отлаживать клиент gdb, чтобы точно определить, что (и почему) оно отправляет и принимает? Или есть настройка в gdb, которая может объяснить это поведение?

С наилучшими пожеланиями

Хенрик

+0

Что это за адрес? Ваша точка входа в вашу программу случайно? – dbrank0

+0

@ dbrank0 Адресный адрес 0xABD37787 не существует на карте памяти HW. ОЗУ идет от 0x40000000 до 0x60000000. Есть несколько регистров с более высокими адресами, но не выше адреса 0xA0020000. Когда я подключаюсь к gdb, программа не работает. CPU находится в режиме отладки, а gdb разговаривает с DSU (модуль поддержки отладки) в ASIC LEON2, который может выполнять чтение и запись в ОЗУ и регистры. – Sp4ceCoder

ответ

3

При отладке сервера GdB я могу видеть, что он получает следующую строку

Вам не нужно быть отладки gdbserver. Вы можете просто включить set debug remote 1 в GDB и иметь GDB для печати всех отправленных и полученных пакетов.

Почему клиент gdb пытается прочитать с этого адреса?

Есть несколько возможностей:

  • GDB считает, что счетчик программы в настоящее время 0xABD37787
  • GDB считает, что необходимо установить точку останова там
  • GDB считает, что есть некоторые данные, которые его необходимо читать

Один из возможных способов выяснить, почему GDB пытается прочитать, что lo катион составляет set debug infrun 1. Это напечатает много информации о том, что GDB сам пытается сделать.

Другой способ - отладить сам GDB. Поместите точку останова на putpkt, и когда пакет, представляющий интерес, отправляется, проверьте стек, чтобы узнать, почему он отправляется.

+0

Спасибо @ Employeed-Russian, это было очень полезно! Используя команды «set debug», которые вы указали, я узнал, что клиент gdb запрашивает значение общего регистра (через запрос «g» в протоколе gdb), когда он подключается к серверу gdb. Сервер отправляет много значений регистра, например, содержимое в регистре O7. Позже, когда клиент gdb выполняет запись в память, он начинается с чтения адреса, указанного значением O7 +8. Поэтому, если сервер говорит, что O7 содержит 0xABD3777F, тогда gdb будет читать 0xABD37787 перед записью в память. – Sp4ceCoder

+0

Адрес O7 + 8 - это обратный адрес для SW, но когда я запускаю gdb, работа SW не работает, то есть регистр O7 может содержать что угодно. Когда я начал эту тему, я сказал, что gdb выполняет это чтение после моей записи, но кажется, что это происходит до записи. – Sp4ceCoder

+0

Кто-нибудь знает, почему gdb читает O7 + 8 до записи в память, или если это поведение может быть изменено? – Sp4ceCoder