如何在没有错误消息的情况下调试 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(我可以从缺少的 coutprint 调用中看出这一点)。没有错误信息,没有段错误,没有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的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有错误消息的情况下中止makefile

如何调试 c++ dll 的 ctypes 调用?

Perl:如何在没有错误消息的情况下“死”?

BAD_ACCESS在什么情况下出现?如何调试BAD_ACCESS错误

如何在没有以下错误消息的情况下安装 ffmpeg-binaries?

如何在没有有用的调用堆栈的情况下调试难以重现的崩溃?