C 程序在调用 perl 函数 newSVpv() 时不断崩溃
C program keeps crashing when calling perl function newSVpv()
尝试使用 perl 数据结构(部分作为在 C 中支持关联数组的一种方式),但以下程序不断崩溃。它编译得很好,但会在 newSVpv() 的行上崩溃。不知道为什么。
#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
int main(int argc, char **argv, char **env) {
char *proto = "http";
SV* ret = newSVpv("http", 4);
sv_catpvn(ret, "://", 3);
STRLEN len = 1;
char *result = SvPV(ret, len);
printf("result: %p %d\n", result, len);
return 0;
}
编译它的行是
gcc -g -o interp te1.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
我的 perl 是 Ubuntu 12.04.4 LTS 上的 5.14.2 运行。
感谢任何提示!
更新:添加了 gdb 跟踪。谢谢你的提问。
gdb 跟踪:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b235a6 in Perl_newSVpv () from /usr/lib/libperl.so.5.14
(gdb) bt
#0 0x00007ffff7b235a6 in Perl_newSVpv () from /usr/lib/libperl.so.5.14
#1 0x0000000000400927 in main (argc=1, argv=0x7fffffffe1e8,
env=0x7fffffffe1f8) at te1.c:7
(gdb)
我通常从 Perl 调用 C,而不是从 C 调用 Perl,但我很确定你的问题是你没有复制 PERL_SYS_INIT3
、perl_alloc
和来自 perlembed example 的 perl_construct
位,因此您实际上没有可以使用的 perl 解释器结构。 newSVpv
当它试图通过不存在的解释器指针访问某些内容时被炸毁。
该示例的最后三行(perl_destruct
、perl_free
和 PERL_SYS_TERM
)也应作为良好做法在程序末尾调用。
尝试使用 perl 数据结构(部分作为在 C 中支持关联数组的一种方式),但以下程序不断崩溃。它编译得很好,但会在 newSVpv() 的行上崩溃。不知道为什么。
#include <EXTERN.h> /* from the Perl distribution */
#include <perl.h> /* from the Perl distribution */
static PerlInterpreter *my_perl; /*** The Perl interpreter ***/
int main(int argc, char **argv, char **env) {
char *proto = "http";
SV* ret = newSVpv("http", 4);
sv_catpvn(ret, "://", 3);
STRLEN len = 1;
char *result = SvPV(ret, len);
printf("result: %p %d\n", result, len);
return 0;
}
编译它的行是
gcc -g -o interp te1.c `perl -MExtUtils::Embed -e ccopts -e ldopts`
我的 perl 是 Ubuntu 12.04.4 LTS 上的 5.14.2 运行。
感谢任何提示!
更新:添加了 gdb 跟踪。谢谢你的提问。 gdb 跟踪:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b235a6 in Perl_newSVpv () from /usr/lib/libperl.so.5.14
(gdb) bt
#0 0x00007ffff7b235a6 in Perl_newSVpv () from /usr/lib/libperl.so.5.14
#1 0x0000000000400927 in main (argc=1, argv=0x7fffffffe1e8,
env=0x7fffffffe1f8) at te1.c:7
(gdb)
我通常从 Perl 调用 C,而不是从 C 调用 Perl,但我很确定你的问题是你没有复制 PERL_SYS_INIT3
、perl_alloc
和来自 perlembed example 的 perl_construct
位,因此您实际上没有可以使用的 perl 解释器结构。 newSVpv
当它试图通过不存在的解释器指针访问某些内容时被炸毁。
该示例的最后三行(perl_destruct
、perl_free
和 PERL_SYS_TERM
)也应作为良好做法在程序末尾调用。