PyString_InternFromString
は、次の宣言を持つc関数です。gdbのc文字列でホストプロセス関数を呼び出せますか?
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
に与えたことは0xcfd020
のconst char *
文字列でしたが、その機能では0x64
に変更されました。 これはなぜ起こったのですか?
gdbから見落とされている混乱した情報は、Pythonインタプリタの最適化バージョンを実行しているためです。あなたがPythonの "デバッグビルド"を得ることができれば(Ubuntuでは、これは 'python2.7-dbg'パッケージです)、あなたは'最適化された 'メッセージを得ることができません。 –
私はPythonデバッグバージョンを試しましたが、同じエラーは発生しませんでした。 @MarkPlotnick –