如何在没有错误信息的情况下调试ctypes
问题描述:
我有一个简单的python脚本,它使用了一个带有的c/C++库。我的C++库也包含一个主要的方法,所以我可以在没有-shared
标志的情况下编译它,并且它可以被执行并且运行没有问题。但是,当我使用从python脚本运行相同的代码时,部分C++程序被执行(我可以从cout
调用中知道)。然后整个应用程序,包括python脚本,termiantes(我可以告诉从失踪的cout
和print
调用)。没有错误信息,没有段错误,没有python stacktrace。如何在没有错误信息的情况下调试ctypes
我的问题是:我该如何调试?这可能发生的原因是什么?
这是代码的一部分,但是,由于没有错误消息,我不知道哪个代码是相关的。
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();
}
答
通常,您从一个小型模型库开始,它只是让您测试来自python的函数调用。准备就绪时(所有的调试打印都可以),您继续下一步。在你的例子中,注释掉#include“testapp.cpp”并获得打印到cout的工作。
我做到了,失败的地方并没有做任何特别的事情(只是一个for循环)。另外,当它不从ctypes调用时,相同的代码也可以工作。 – Toast
好。那么是时候使用一个调试器(例如gdb)。在C++函数中设置一个断点。不幸的是,使用调试器并不容易。 – ddbug
这解决了我的问题。问题是我正在使用一个指针数组而不是初始化它。当编译为一个可执行文件时,该数组以某种方式只包含nullpointers,我的代码正确处理。 – Toast