У меня есть библиотека Perl, написанная на C и внутри файла XS. Я объявлял функцию обратного вызова для вызова функций Perl из кода C. Когда эта функция вызывается из кода C (многопоточная):Вызов функции Perl из C сбоя продукта
char *
callbackfunc(void *fun, char **args)
{
dSP;
int count,i;
char *s;
ENTER;
SAVETMPS;
PUSHMARK(SP);
for(i=0;args[i];++i) {
XPUSHs(sv_2mortal(newSVpv(args[i],0)));
}
PUTBACK;
count = call_sv(fun,G_SCALAR|G_EVAL);
SPAGAIN;
s = NULL;
if(count > 1)
croak("callback may return only single value\n");
if(count==1) {
s = strdup(POPp);
}
PUTBACK;
FREETMPS;
LEAVE;
return s;
}
я получаю аварии на ЦОС макросъемки:
#0 callbackfunc (fun=0x2416a58, args=0x7f3a0cfa9a10) at MyLibrary.xs:24
24 dSP;
В дизассемблере это похоже на какой-нить конкретных данных не найдены:
push %r15
push %r14
mov %rdi,%r14
push %r13
mov %rsi,%r13
push %r12
push %rbp
push %rbx
sub $0x8,%rsp
mov 0x2015dd(%rip),%rbx
mov (%rbx),%edi
callq 0x7f3a0e37f550 <[email protected]>
mov (%rbx),%esi
mov (%rax),%r15 // here is crash because %rax is 0x0
Эта строка очень подозрительна: 'for (i = 0; args [i]; ++ i)', вы имеете в виду 'for (i = 0; i
@AlterMann, возможно, вы правы, но в настоящее время он не попал в него, потому что он разбился очень рано. –
Hooray для использования '++ i' вместо' i ++ ' – Borodin