gdb python: обход массива структур

Разве мы не можем обойти массив структур? Я имею в виду для каждого индекса, проверяя содержимое структур и соответственно печатая каждое поле? Как мы можем сделать для такой структуры, как

s = gdb.parse_and_eval(expr)
for k in s.type.keys():
    v = s[k]
    if is_pointer(v):
          .....
    elif is_array(v):
          .....

Как получить контроль доступа к элементам по каждому индексу массива?


person Baijnath Jaiswal    schedule 17.06.2013    source источник


Ответы (1)


Вы можете индексировать массив, используя нотацию []. Например, если 'v' является gdb.Value, представляющим массив или указатель, вы можете получить 5-й элемент с помощью v[5].

В руководстве есть длинный раздел о Value API, в котором все это объясняется.

person Tom Tromey    schedule 18.06.2013
comment
У меня есть еще одно сомнение: при выполнении gdb.execute('thread apply all bt') в определенном потоке он показывает Cannot access memory at address 0x5effffe500 и выходит из приглашения gdb. если я использую try: gdb.execute('thread apply all bt') except gdb.error: gdb.write(',\n'), то он не выходит из приглашения gdb, но пропускает все дальнейшие потоки. Я хочу войти в каждый поток и напечатать bt для всех потоков один за другим. Есть ли какой-нибудь солотон для этого или какой-либо другой способ получить это ..? Будьте любезны руководство.. - person Baijnath Jaiswal; 20.06.2013
comment
Вместо этого перебирайте потоки в Python. Вы также можете вычислить трассировку стека из Python. - person Tom Tromey; 20.06.2013
comment
Спасибо tromey :-) теперь я могу перебирать все потоки и печатать обратную трассировку каждого потока, но когда возникает исключение, я хочу напечатать точное сообщение об ошибке gdb, например Cannot access memory at address 0x5effffe500, с правильным адресом в моем обработчике исключений. Итак, как получить сообщение об ошибке gdb? - person Baijnath Jaiswal; 21.06.2013
comment
Он находится в исключении python. Вам действительно следует прочитать часть руководства по Python API. - person Tom Tromey; 21.06.2013
comment
Конечно, Троми, я буду читать снова. Еще одна вещь. Кажется, в модуле gdb не определена какая-либо константа для массива указателей (например, gdb.TYPE_CODE_PTR) ..? Пробежался по мануалу, не нашел :( - person Baijnath Jaiswal; 23.06.2013
comment
Существует тип массива, и вы можете посмотреть на тип элемента массива, чтобы определить, является ли он массивом указателей. - person Tom Tromey; 24.06.2013
comment
Где этот мифический мануал? Единственное, что я могу найти (в исходное программное обеспечение. org/gdb/onlinedocs/gdb/) ничего не говорит о массивах. - person Chris Dodd; 14.04.2017
comment
Да, забавно, я вижу, что синтаксис массива не задокументирован. Это ошибка в руководстве по gdb. - person Tom Tromey; 14.04.2017