3

我遇到错误

分段故障

使用以下 Perl 代码:

use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use Image::ValidJpeg;

my $url = ...
my $ua = LWP::UserAgent->new(agent => '');
my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);

if (($response->is_success) &&
    ($response->code == 200) && 
    ($response->header('Content-Type') eq 'image/jpeg'))
{
  my $content = $response->decoded_content;
  open(my $img, '<', \$content);
  my $check = Image::ValidJpeg::check_all($img);
  print "$check\n";
}

为什么会出现这样的错误?我的代码不正确吗?


调试信息:

(gdb) run /home/test.pl 
Starting program: /home/test.pl
[Thread debugging using libthread_db enabled]
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff683a7e0 in feof () from /lib64/libc.so.6

(gdb) bt
#0  0x00007ffff683a7e0 in feof () from /lib64/libc.so.6
#1  0x00007ffff5d4af82 in valid_jpeg (fh=0x0, seek_over_entropy=0 '\000') at valid_jpeg.c:50
#2  0x00007ffff5d4a94b in XS_Image__ValidJpeg_check_all (my_perl=<value optimized out>, cv=<value optimized out>) at ValidJpeg.c:138
#3  0x00007ffff7b18805 in Perl_pp_entersub () from /usr/lib64/perl5/CORE/libperl.so
#4  0x00007ffff7b16af6 in Perl_runops_standard () from /usr/lib64/perl5/CORE/libperl.so
#5  0x00007ffff7abf0d8 in perl_run () from /usr/lib64/perl5/CORE/libperl.so
#6  0x0000000000400cac in main ()
4

2 回答 2

4

看看. Image::ValidJpeg_ valid_jpeg.c_ FILE*内存中的文件句柄无法映射到FILE*,因此这不起作用。

有一篇有关内存文件句柄和 XS的相关StackOverflow 文章。

可能最好的解决方案是在这里使用纯 perl 模块,或者误用ImagerImage::Magick仅用于验证,或者使用带有Image::ValidJpeg. 并且不要忘记错误报告。

于 2013-09-16T20:40:47.977 回答
1

正如 amon 所说,当这种情况发生时,它表明底层实现中存在错误,而不是(仅)脚本。即使您误用了一个模块,该模块的 XS 代码也会让您的错误变成内存访问冲突——这是编写 XS 的人的错误。你不能在普通的 perl 中做到这一点。

如果您熟悉 gdb(gnu 调试器),这将更容易找到罪魁祸首:

gdb perl 

将 perl 加载到调试器中。在提示下:

run ./myscript.pl

显然“./myscript.pl”应该是您要运行的脚本的真实路径。该脚本将启动,尽管比正常得多,并允许您进行任何交互。当 seg 错误发生时,gdb 将暂停并指出这一点。此时输入bt并保存输出。

您可以在错误报告中包含此回溯。如果您不确定哪个模块有问题,请发布回溯,应该会有人告诉您。

于 2013-09-16T20:23:30.190 回答