2017-02-15 13 views
0

PyString_InternFromString является c-функцией со следующим объявлением.Могу ли я вызвать функцию хост-процесса с помощью c-строки в gdb?

PyObject *PyString_InternFromString(const char *cp) 

Я назвал эту функцию в gdb следующими командами и выходами.

(gdb) p (char *) malloc(10) 
$8 = 0xcfd020 "\210\066▒\364\177" 
(gdb) call strcpy(0xcfd020, "nihao") 
$9 = 13619232 
(gdb) p PyString_InternFromString 
$10 = {PyObject *(const char *)} 0x419158 <PyString_InternFromString> 
(gdb) break PyObject_Malloc 
Breakpoint 1 at 0x418004: PyObject_Malloc. (17 locations) 
(gdb) p 0xcfd020 
$11 = 13619232 
(gdb) p (const char*)0xcfd020 
$12 = 0xcfd020 "nihao" 
(gdb) p ((PyObject * (*)(const char *))0x419158)((const char *)0xcfd020) 
Breakpoint 1, PyString_InternFromString (cp=0x64 <error: Cannot access memory at address 0x64>) at ../Objects/stringobject.c:4783 
4783 ../Objects/stringobject.c: No such file or directory. 
The program being debugged stopped while in a function called from GDB. 
Evaluation of the expression containing the function 
(PyString_InternFromString) will be abandoned. 
When the function is done executing, GDB will silently stop. 
(gdb) bt 
#0 PyString_InternFromString (cp=0x64 <error: Cannot access memory at address 0x64>) at ../Objects/stringobject.c:4783 
#1 0x00007ff489a1a0c0 in ??() 
#2 0x7b752ef9cf7f0a00 in ??() 
#3 0x00007ff489b1b050 in ??() 
#4 0x0000000000000065 in ??() 
#5 0x0000000000000000 in ??() 
(gdb) n 

Program received signal SIGSEGV, Segmentation fault. 
PyObject_Malloc (nbytes=<optimized out>) at ../Objects/obmalloc.c:882 
882  ../Objects/obmalloc.c: No such file or directory. 
(gdb) bt 
#0 PyObject_Malloc (nbytes=<optimized out>) at ../Objects/obmalloc.c:882 
#1 PyString_FromString (str=0x64 <error: Cannot access memory at address  0x64>) at ../Objects/stringobject.c:143 
#2 PyString_InternFromString (cp=0x64 <error: Cannot access memory at address 0x64>) at ../Objects/stringobject.c:4783 
#3 0x00007ff489a1a0c0 in ??() 
#4 0x7b752ef9cf7f0a00 in ??() 
#5 0x00007ff489b1b050 in ??() 
#6 0x0000000000000065 in ??() 
#7 0x0000000000000000 in ??() 
(gdb) info locals 
bp = <optimized out> 
pool = 0x7ff489a0a370 
next = <optimized out> 
size = 9607536 
(gdb) info args 
nbytes = <optimized out> 
(gdb) f 1 
#1 PyString_FromString (str=0x64 <error: Cannot access memory at address 0x64>) at ../Objects/stringobject.c:143 
143  ../Objects/stringobject.c: No such file or directory. 
(gdb) info locals 
size = 100 
op = <optimized out> 
(gdb) info args 
str = 0x64 <error: Cannot access memory at address 0x64> 
(gdb) p ((PyObject * (*)(const char *))0x419158)(&((const char *)0xcfd020)) 
Attempt to take address of value not located in memory. 
(gdb) call strlen("nihaobuhoa") 
$13 = 10 

мне не удалось вызвать функцию с Segmentation fault. Мы можем узнать, что Cannot access memory at address 0x64 вызывают ошибку на выходе. Это действительно смутило меня, то, что я дал PyString_InternFromString, было строкой const char * по адресу 0xcfd020, но смените на 0x64 в функции. Кто-нибудь знает, почему это произошло?

+0

Я думаю, что много недостающей и запутанной информации, которую вы видите из gdb, связано с тем, что вы используете оптимизированную версию интерпретатора python. Если вы можете получить «отладочную сборку» python (на Ubuntu это пакет 'python2.7-dbg'), вы обнаружите, что не будете получать сообщения« оптимизированы ». –

+0

Я пробовал отладочную версию python, но не произошла такая же ошибка. @MarkPlotnick –

ответ

0

Это потому, что GDB прочитал неправильный адрес PyString_InternFromString из таблицы символов. Я сбросил таблицу символов python в текстовый файл и обнаружил, что реальный адрес PyString_InternFromString отличается от адреса, напечатанного из gdb.

0

Возможно, способ, которым вы называете свою функцию, скрывает слишком много вещей для GDB.

Вместо того, чтобы ссылаться на литой указатель на функцию PyString_InternFromString(), почему бы вам просто не назвать его напрямую? Вы также можете использовать строку C при вызове функции, GDB автоматически вызывает malloc(), чтобы вы могли создать строку.

(gdb) # reach a point where every initializations of your call (and 
subcalls) are done. For example, main. 
(gdb) b main 
(gdb) run 
(gdb) p /x PyString_InternFromString("nihao") 

Примечание:

  1. Этот вызов неявно зависит от предварительной инициализации всего это требует, то есть глобальные объекты прямо или косвенно используются. Если это так, вы должны сначала разбить и выполнить этот вызов после таких инициализаций.

  2. Функции вызова из GDB по крайней мере требуют, чтобы среда выполнения C была сначала инициализирована по тем же причинам, указанным в пункте 1. Таким образом, вы должны выполнять свои вызовы, когда вы достигли функции main().

  3. Можно отлаживать функцию, вызванную через GDB (как указано сообщением об ошибке ../Objects/stringobject.c: No such file or directory.). Загрузите его и specify the directory to GDB, то вы должны быть в состоянии его отладки (отладочная информация может быть обособленной, если это библиотека от вас распределения ОС)

 Смежные вопросы

  • Нет связанных вопросов^_^