2013-06-26 5 views
2

почему я получаю неправильный ответ при выполнении арифметических операций:gdb python: Как выполнить арифметическую операцию на gdb.value?

(gdb) python address = gdb.parse_and_eval('&(((struct my_struct *)next->priv).wait_list)') 
(gdb) python print address 
0x410027a00728 
(gdb) python offset = gdb.parse_and_eval('&((struct wait_list_t *)0)->list') 
(gdb) python print offset 
0x0 
(gdb) python diff = address - offset 
gdb) python print diff 
0x410027a0072 

в то время как выход должен быть 0x410027a00728. я проверил тип адреса и компенсировано

(gdb) python print address.type 
struct list_head * 
(gdb) python print offset.type 
struct list_head * 

Я попытался это также

(gdb) python y = hex(long(address)) 
(gdb) python print y 
0x410027A14FF0L 
(gdb) python z = hex(long(offset)) 
(gdb) python print z 
0x0L 
(gdb) python diff = y - z 
Traceback (most recent call last): 
File "<string>", line 1, in ? 
TypeError: unsupported operand type(s) for -: 'str' and 'str' 
Error while executing Python code. 

Есть ли альтернатива, чтобы сделать это?

+0

Есть ли 'python diff = long (address) - long (offset)' work? – user4815162342

+0

Спасибо. :-) Это сработало именно то, что я хотел. –

ответ

1

Вычитание двух значений типа указателя. Это означает, что результат, как и в C, делится на размер объекта.

Вместо этого убедитесь, что «смещение» имеет целостный тип, а не тип указателя.

В последнем примере вы пытаетесь вычесть строки. Вы не можете этого сделать. Переместите вызовы на «hex» из вычислений на отпечатки, и он будет работать.

+0

Еще раз спасибо Tromey :-) –

+0

tromey, в скрипте 'print-struct-follow-pointers.py', написанном здесь http://stackoverflow.com/questions/16787289/gdb-python-parsing-structures-each-field- и-print-them-with-proper-value-if, аналогично условию 'is_pointer (v)' в скрипте, я проверяю еще одно условие на 'if is_typedef (v):' 'type_ = v.type.strip_typedefs() ' ' print 'type =% s'% (type_) ' в случае некоторых структур, он печатает правильный тип, но для некоторых структур он печатает' type = struct {...} '. я не могу найти точную причину. –

+0

решен. :-) это было из-за анонимной структуры .. !! нет поддержки для ключевого слова python 'with' и' as' внутри gdb? почему он не работает? код находится здесь http://stackoverflow.com/questions/17448736/gdb-python-why-below-code-is-not-working-under-gdb –