2015-06-12 1 views
3

У меня есть адрес 0x6041f0. Я знаю, что там сидит целое число. В C я бы просто сделал *(int *)0x6041f0, чтобы получить целочисленное значение, присутствующее на этом адресе.Как разыменовать адрес в целое число в python?

Как добиться того же в Python?

PS: Я пишу скрипт Python, который использует модуль gdb. Фактическая отлаживаемая программа находится на C++. Так как требуется много манипуляций с низким уровнем.

+0

Могу ли я спросить, почему/как вы закончили тем, что манипулировать адрес как '0x6041f0' в вашей программе Python? – TigerhawkT3

+1

Вы работаете с объектами 'gdb.Value'? Я не знаком с API-интерфейсом GDB Python, но, глядя на [документы] (https://sourceware.org/gdb/onlinedocs/gdb/Values-From-Inferior.html), похоже, если у вас есть 'gdb.Value', представляющий целое число, которое было выбрано из указателя, вы вызываете метод Value.cast, чтобы передать его указателю, затем' Value.dereference', чтобы разыменовать его. Я не знаю, есть ли какие-либо соображения, которые сделают особенно плохую идею обходить это и использовать ctypes, но, похоже, безопаснее всего идти с предоставленным API. – user2357112

+0

Вы говорите об указателе в процессе выполнения скрипта python или указателе в отладочном процессе? Потому что это будет иметь огромное значение. – textshell

ответ

1

Что-то вроде этого:

$ python 
Python 2.7.9 (default, Mar 19 2015, 22:32:11) 
[GCC 4.8.4] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from ctypes import * 
>>> c_int_p = POINTER(c_int) 
>>> x = c_int(4) 
>>> cast(addressof(x), c_int_p).contents 
c_int(4) 

С этой artbitrary адрес :)

>>> cast(0x6041f0, c_int_p) 
<__main__.LP_c_int object at 0x7f44d06ce050> 
>>> cast(0x6041f0, c_int_p).contents 
Segmentation fault 

См: ctypes для справки