如何在没有错误消息的情况下调试 ctypes
Posted
技术标签:
【中文标题】如何在没有错误消息的情况下调试 ctypes【英文标题】:How to debug ctypes without error message 【发布时间】:2016-09-25 00:38:04 【问题描述】:我有一个简单的 python 脚本,它使用带有ctypes
的 c/c++ 库。我的 c++ 库还包含一个 main 方法,因此我可以在没有 -shared
标志的情况下编译它,并且可以执行它并且运行没有问题。
但是,当我使用 ctypes
从 python 脚本运行相同的代码时,c++ 程序的一部分被执行(我可以从 cout
调用中看出这一点)。然后是整个应用程序,包括 python 脚本,termiantes(我可以从缺少的 cout
和 print
调用中看出这一点)。没有错误信息,没有段错误,没有python stacktrace。
我的问题是:我该如何调试它?发生这种情况的可能原因是什么?
这里是部分代码,不过,由于没有错误信息,所以不知道哪个代码是相关的。
import ctypes
interface = ctypes.CDLL("apprunner.so")
interface.start()
print "complete"
.
#include "../../app/ShaderApp.cpp"
#include <iostream>
#include "TestApp.cpp"
TestApp* app = 0;
extern "C" void start()
app = new TestApp();
cout << "Running from library" << endl;
app->run();
int main( int argc, const char* argv[])
cout << "Running from excecutable" << endl;
start();
【问题讨论】:
【参考方案1】:通常,您从一个小型模拟库开始,该库仅允许您测试来自 python 的函数调用。准备好后(所有调试打印都正常),您可以继续进行。在您的示例中,注释掉 #include "testapp.cpp" 并让 cout 正常工作。
【讨论】:
我做到了,它失败的地方没有做任何特别的事情(只是一个 for 循环)。此外,当不从 ctypes 调用相同的代码时,它也可以工作。 好。然后是使用调试器(例如 gdb)的时候了。在 c++ 函数中设置断点。不幸的是,使用调试器并不容易。 这解决了我的问题。问题是我使用的是指针数组而不是初始化它。当编译为可执行文件时,数组不知何故只包含空指针,我的代码处理正确。以上是关于如何在没有错误消息的情况下调试 ctypes的主要内容,如果未能解决你的问题,请参考以下文章
BAD_ACCESS在什么情况下出现?如何调试BAD_ACCESS错误