2013-02-25 3 views
4

Я использую AcePerl для загрузки данных из базы данных wormbase.org. Когда я загружаю определенные объекты базы данных, я получаю (после определенного количества объектов) ошибку сегментации. Это поведение воспроизводимо.Debug Perl Segmentation Fault

Я имел взгляд на дамп и where печатает огромный стек вызовов функций:

#0 0xb763c0ac in ??() from /lib/i386-linux-gnu/libc.so.6 
#1 0xb763eddc in malloc() from /lib/i386-linux-gnu/libc.so.6 
#2 0x080c07ca in Perl_safesysmalloc() 
#3 0x080f3a02 in Perl_sv_grow() 
#4 0x080ebe38 in Perl_sv_setsv_flags() 
#5 0x080ecb76 in Perl_newSVsv() 
#6 0x0811516f in Perl_save_item() 
#7 0x080c7dd8 in Perl_get_db_sub() 
#8 0x080e7a4c in Perl_pp_entersub() 
#9 0x08075570 in Perl_call_sv() 
#10 0x080edd25 in Perl_sv_clear() 
#11 0x080ee3eb in Perl_sv_free2() 
#12 0x080d79ec in Perl_hv_free_ent() 
#13 0x080d7c8c in ??() 
#14 0x080db6ff in Perl_hv_undef_flags() 
#15 0x080edf72 in Perl_sv_clear() 
#16 0x080ee3eb in Perl_sv_free2() 
#17 0x080d79ec in Perl_hv_free_ent() 
#18 0x080d7c8c in ??() 
#19 0x080db6ff in Perl_hv_undef_flags() 
#20 0x080edf72 in Perl_sv_clear() 
#21 0x080ee3eb in Perl_sv_free2() 
#22 0x080d79ec in Perl_hv_free_ent() 
#23 0x080d7c8c in ??() 
#24 0x080db6ff in Perl_hv_undef_flags() 
#25 0x080edf72 in Perl_sv_clear() 
#26 0x080ee3eb in Perl_sv_free2() 
#27 0x080d79ec in Perl_hv_free_ent() 
#28 0x080d7c8c in ??() 
#29 0x080db6ff in Perl_hv_undef_flags() 
#30 0x080edf72 in Perl_sv_clear() 
#31 0x080ee3eb in Perl_sv_free2() 
#32 0x080d79ec in Perl_hv_free_ent() 
#33 0x080d7c8c in ??() 
#34 0x080db6ff in Perl_hv_undef_flags() 
#35 0x080edf72 in Perl_sv_clear() 
#36 0x080ee3eb in Perl_sv_free2() 
#37 0x080d79ec in Perl_hv_free_ent() 
#38 0x080d7c8c in ??() 
#39 0x080db6ff in Perl_hv_undef_flags() 
#40 0x080edf72 in Perl_sv_clear() 
#41 0x080ee3eb in Perl_sv_free2() 
#42 0x080d79ec in Perl_hv_free_ent() 
#43 0x080d7c8c in ??() 
#44 0x080db6ff in Perl_hv_undef_flags() 
#45 0x080edf72 in Perl_sv_clear() 
#46 0x080ee3eb in Perl_sv_free2() 
#47 0x080d79ec in Perl_hv_free_ent() 
#48 0x080d7c8c in ??() 
#49 0x080db6ff in Perl_hv_undef_flags() 
#50 0x080edf72 in Perl_sv_clear() 
#51 0x080ee3eb in Perl_sv_free2() 
#52 0x080d79ec in Perl_hv_free_ent() 
#53 0x080d7c8c in ??() 
... 

Эти вызовы функции повторяются тысячи раз. Я также назвал perl -d:Trace myscript.pl > log, но файл журнала размером около 3 ГБ.

Есть ли более удобный способ для отладки этого скрипта?

EDIT: Мой сценарий: http://paste.ubuntu.com/5564630/.
My schema file: http://paste.ubuntu.com/5564631/. Он определяет, какие данные необходимо загрузить.
Последовательный отказ возникает после ~ 2300 go_terms.

+0

Возможно, стоит посмотреть, что находится в трассировке стека до бит цикла. – ikegami

+0

Вы пробовали с последней версией Perl? – ikegami

+0

Можете ли вы рассказать мне, как извлечь эту трассировку стека? – user2004469

ответ

5

Установить Devel::Trace.

Запустите PERL скрипт с включенной трассировкой:

perl -d:Trace myscript.pl >trace 2>&1 

Tail файл, чтобы увидеть, какие строки Perl выполняются ведущие к ошибке сегментации.