使用 GDB 调试 Python 的玩具示例 c++ 库时出错(与加载共享库相关的 GDB 问题?)
Error Debugging toy example c++ Library for Python with GDB (GDB problem relating to loading shared libraries?)
每当我尝试使用 GDB 在 Ubuntu 18.04 上为 python 调试 c/c++ 库时,我都会收到以下错误消息:
/build/glibc-2ORdQG/glibc-2.27/sysdeps/unix/sysv/linux/select.c
无法打开
我怀疑它与使用 GDB 加载共享库有关,但我不确定。
如果我将 glibc 源代码复制到那个位置,我会得到这样的异常:
libc.so.6!__GI___select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout) (/build/glibc-2ORdQG/glibc-2.27/sysdeps/unix/sysv/linux/select.c:41) [Unknown/Just-In-Time compiled code] (Unknown Source:0)
我正在尝试从 here 中粗略地复制教程。
我之前做的步骤:
创建一个文件夹“/home/jhm/Documents/pythonClibToyExample”来工作。
使用代码创建文件“myadd.cpp”:
#include <Python.h>
static PyObject *method_myadd(PyObject *self, PyObject *args){
int x, y, z = -1;
/* Parse arguments */
if(!PyArg_ParseTuple(args, "ii", &x, &y)){
return NULL;
}
/* The actual bit of code I need */
z = x + y;
return PyLong_FromLong(z);
}
static PyMethodDef myaddMethods[] = {
{"myadd", method_myadd, METH_VARARGS, "Python interface for myadd C library function"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef myaddmodule = {
PyModuleDef_HEAD_INIT,
"myadd",
"Python interface for the myadd C library function",
-1,
myaddMethods
};
PyMODINIT_FUNC PyInit_myadd(void) {
return PyModule_Create(&myaddmodule);
}
用代码
创建一个“setup.py”
from distutils.core import setup, Extension
def main():
setup(name="myadd",
version="1.0.0",
description="Python interface for the myadd C library function",
author="Nadiah",
author_email="nadiah@nadiah.org",
ext_modules=[Extension("myadd", ["myadd.cpp"])],
)
if __name__ == "__main__":
main()
运行 python3 setup.py build
在终端
我想创建一个本地 python 包来导入,所以我
创建一个文件夹“myadd”并将“myadd.cpython-36m-x86_64-linux-gnu.so”从./build/lib.linux-x86_64-3.6/目录复制到myadd文件夹
在 myadd 文件夹中创建一个包含 from .myadd import *
的“__init__.py”。
在 myadd 文件夹中创建一个代码为
的“myadd.py”
def __bootstrap__():
global __bootstrap__, __loader__, __file__
import sys, pkg_resources, imp
__file__ = pkg_resources.resource_filename(__name__, 'myadd.cpython-36m-x86_64-linux-gnu.so')
__loader__ = None; del __bootstrap__, __loader__
imp.load_dynamic(__name__,__file__)
__bootstrap__()
并使用代码
创建一个“main.py”
import glob
import os
import sys
try:
sys.path.append('/home/jhm/Documents/pythonClibToyExample')
except IndexError:
pass
import myadd
print(os.getpid())
x = myadd.myadd(5,6)
print(x)
我使用了 Visual Studio 代码以及以下 launch.json:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Attach",
"type": "cppdbg",
"request": "attach",
"program": "/home/jhm/Documents/pythonClibToyExample/build/lib.linux-x86_64-3.6/myadd.cpython-36m-x86_64-linux-gnu.so",
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}
]
}
在 myadd 中执行任何操作之前在 main.py 中设置一个断点,并希望将 gdb 附加到打印的 pid。但是,一旦我输入用于附加 gdb 调试器的 sudo pw,就会以上述异常结束。
我在不同的计算机上试过这个,也试过在终端中使用 sudo gdb '/home/jhm/Documents/pythonClibToyExample/build/lib.linux-x86_64-3.6/myadd.cpython-36m-x86_64-linux-gnu.so'
然后 attach &printed pid
- 但同样的错误(glibc 源代码位于 /build/glibc-2ORdQG/glibc-2.27/) .
Attaching to program: /home/jhm/Documents/pythonClibToyExample/build/lib.linux-x86_64-3.6/myadd.cpython-36m-x86_64-linux-gnu.so, process 7721
[New LWP 7728]
[New LWP 7730]
[New LWP 7732]
[New LWP 7733]
[New LWP 7734]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007fc5e51f313f in __GI___select (nfds=0, readfds=0x0, writefds=0x0,
exceptfds=0x0, timeout=0x7fff284935b0)
at ../sysdeps/unix/sysv/linux/select.c:41
41 return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,
我在这里做错了什么?我是否必须指定 gdb 应该在哪里寻找 glib-c(因为根 /build/... 显然是错误的)?因为 运行 程序没有问题,所以我在编译调试时错过了一些关键步骤吗?我真的只是想调试我编译的 cpp 代码,而不是任何与 glibc 相关的东西。
好的,我解决了。我有一个错误的启动配置...要调试的程序是我的 python 解释器而不是 .so 对象...它甚至在教程中...但我想我混淆了调试独立 c 的配置程序。 -_-
每当我尝试使用 GDB 在 Ubuntu 18.04 上为 python 调试 c/c++ 库时,我都会收到以下错误消息:
/build/glibc-2ORdQG/glibc-2.27/sysdeps/unix/sysv/linux/select.c
无法打开
我怀疑它与使用 GDB 加载共享库有关,但我不确定。
如果我将 glibc 源代码复制到那个位置,我会得到这样的异常:
libc.so.6!__GI___select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout) (/build/glibc-2ORdQG/glibc-2.27/sysdeps/unix/sysv/linux/select.c:41) [Unknown/Just-In-Time compiled code] (Unknown Source:0)
我正在尝试从 here 中粗略地复制教程。
我之前做的步骤:
创建一个文件夹“/home/jhm/Documents/pythonClibToyExample”来工作。
使用代码创建文件“myadd.cpp”:
#include <Python.h>
static PyObject *method_myadd(PyObject *self, PyObject *args){
int x, y, z = -1;
/* Parse arguments */
if(!PyArg_ParseTuple(args, "ii", &x, &y)){
return NULL;
}
/* The actual bit of code I need */
z = x + y;
return PyLong_FromLong(z);
}
static PyMethodDef myaddMethods[] = {
{"myadd", method_myadd, METH_VARARGS, "Python interface for myadd C library function"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef myaddmodule = {
PyModuleDef_HEAD_INIT,
"myadd",
"Python interface for the myadd C library function",
-1,
myaddMethods
};
PyMODINIT_FUNC PyInit_myadd(void) {
return PyModule_Create(&myaddmodule);
}
用代码
创建一个“setup.py”from distutils.core import setup, Extension
def main():
setup(name="myadd",
version="1.0.0",
description="Python interface for the myadd C library function",
author="Nadiah",
author_email="nadiah@nadiah.org",
ext_modules=[Extension("myadd", ["myadd.cpp"])],
)
if __name__ == "__main__":
main()
运行 python3 setup.py build
在终端
我想创建一个本地 python 包来导入,所以我 创建一个文件夹“myadd”并将“myadd.cpython-36m-x86_64-linux-gnu.so”从./build/lib.linux-x86_64-3.6/目录复制到myadd文件夹
在 myadd 文件夹中创建一个包含 from .myadd import *
的“__init__.py”。
在 myadd 文件夹中创建一个代码为
的“myadd.py”def __bootstrap__():
global __bootstrap__, __loader__, __file__
import sys, pkg_resources, imp
__file__ = pkg_resources.resource_filename(__name__, 'myadd.cpython-36m-x86_64-linux-gnu.so')
__loader__ = None; del __bootstrap__, __loader__
imp.load_dynamic(__name__,__file__)
__bootstrap__()
并使用代码
创建一个“main.py”import glob
import os
import sys
try:
sys.path.append('/home/jhm/Documents/pythonClibToyExample')
except IndexError:
pass
import myadd
print(os.getpid())
x = myadd.myadd(5,6)
print(x)
我使用了 Visual Studio 代码以及以下 launch.json:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Attach",
"type": "cppdbg",
"request": "attach",
"program": "/home/jhm/Documents/pythonClibToyExample/build/lib.linux-x86_64-3.6/myadd.cpython-36m-x86_64-linux-gnu.so",
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}
]
}
在 myadd 中执行任何操作之前在 main.py 中设置一个断点,并希望将 gdb 附加到打印的 pid。但是,一旦我输入用于附加 gdb 调试器的 sudo pw,就会以上述异常结束。
我在不同的计算机上试过这个,也试过在终端中使用 sudo gdb '/home/jhm/Documents/pythonClibToyExample/build/lib.linux-x86_64-3.6/myadd.cpython-36m-x86_64-linux-gnu.so'
然后 attach &printed pid
- 但同样的错误(glibc 源代码位于 /build/glibc-2ORdQG/glibc-2.27/) .
Attaching to program: /home/jhm/Documents/pythonClibToyExample/build/lib.linux-x86_64-3.6/myadd.cpython-36m-x86_64-linux-gnu.so, process 7721
[New LWP 7728]
[New LWP 7730]
[New LWP 7732]
[New LWP 7733]
[New LWP 7734]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007fc5e51f313f in __GI___select (nfds=0, readfds=0x0, writefds=0x0,
exceptfds=0x0, timeout=0x7fff284935b0)
at ../sysdeps/unix/sysv/linux/select.c:41
41 return SYSCALL_CANCEL (select, nfds, readfds, writefds, exceptfds,
我在这里做错了什么?我是否必须指定 gdb 应该在哪里寻找 glib-c(因为根 /build/... 显然是错误的)?因为 运行 程序没有问题,所以我在编译调试时错过了一些关键步骤吗?我真的只是想调试我编译的 cpp 代码,而不是任何与 glibc 相关的东西。
好的,我解决了。我有一个错误的启动配置...要调试的程序是我的 python 解释器而不是 .so 对象...它甚至在教程中...但我想我混淆了调试独立 c 的配置程序。 -_-