在 perl 中调试由 SWIG 包装的共享库

Posted

技术标签:

【中文标题】在 perl 中调试由 SWIG 包装的共享库【英文标题】:debugging a shared library wrapped by SWIG in perl 【发布时间】:2011-10-04 14:34:50 【问题描述】:

我在 Perl 中使用 SWIG 包装了我的 C/C++ 代码。由于包装的代码,我几乎没有分段错误。我正在尝试将ddd 与 Perl 脚本一起使用,但不幸的是,即使我在脚本的一行(调用 C/C++ 代码的那个)上设置了一个断点,ddd 也无法进入 C/ C++ 代码。

当我调试 Perl 代码时,有什么方法可以在我的 C lib 中设置断点,或者你知道在我运行这个 Perl 脚本时调试 C lib 的好方法/工具吗?

我正在使用 Linux/gcc。

【问题讨论】:

【参考方案1】:

我做了一件简单的事。我直接在perl解释器上调用了gdb

    gdb /usr/bin/perl
    (gdb) r myscript
    #block the script someway or rerun it
    (gdb) b whatever_my_function

似乎一旦 scipt 运行共享内存也被加载到内存中。一旦发生这种情况,我就可以使用所有信息、函数和断点进行调试。

【讨论】:

如果我使用的是 Komodo,如何调试它? 嗨 rpg。我不知道。我看了看,Komodo 似乎是一个专门调试 PERL 脚本的 IDE。不知道Perl调用共享库的时候能不能调试C/C++指令。对于 GDB,起点是 PERL 解释器的二进制文件。断点是在一行 C/C++ 代码中设置的,而不是在 Perl 脚本的一行中。【参考方案2】:

我只使用 SWIG 从 TCL 调用 C++,并使用 Visual Studio 对其进行了调试,但同样的想法也应该适用于您的案例。我将描述我为调试所做的工作,希望您能弄清楚如何将其应用于您的情况。

构建 C++ 模块的调试版本 确保 TCL 脚本包含调试版本(TCL load 命令中的路径指向模块的调试版本) 在 C++ 代码中放置断点 通过Visual Studio调试器调用TCL脚本;例如使用的命令是tclsh85.exe MyScript.tcl

HTH

【讨论】:

以上是关于在 perl 中调试由 SWIG 包装的共享库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SWIG 在进程和调用脚本子进程之间共享库?

如何使用共享库构建 vtkLocal 示例?

使用 SWIG (AIX 5.1) 从 Perl 调用 C++ 库时崩溃

SWIG 3 中文手册——4. 脚本语言

swig-php 包装器使用指针,c 代码是一个数组

Perl:在线程之间共享复杂的数据结构