2015-11-04 3 views
-1

У меня есть сценарий R, который генерирует ошибку segfault. Сценарий R использует пакет «RSofia», который внутренне вызывает программу на C++, используя пакет Rcpp, который, как я считаю, вызывает проблему.Интерпретация вывода valgrind скрипта R

Пожалуйста, обратитесь к ссылке на вопрос, который я разместил на том же: RSofia Issue

Я пытаюсь отлаживать и определить, что вызывает проблему, используя Valgrind следующим образом:

R -d "valgrind --leak-check=full --show-reachable=yes" -f svm.r 

Это бросает следующий результат:

==11235== Memcheck, a memory error detector 
==11235== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. 
==11235== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info 
==11235== Command: /usr/lib64/R/bin/exec/R -f svm.r 
==11235== 

vex: priv/main_main.c:319 (LibVEX_Translate): Assertion `are_valid_hwcaps(VexArchAMD64, vta->archinfo_host.hwcaps)' failed. 
vex storage: T total 0 bytes allocated 
vex storage: P total 0 bytes allocated 

valgrind: the 'impossible' happened: 
    LibVEX called failure_exit(). 
==11235== at 0x38031DA7: report_and_quit (m_libcassert.c:235) 
==11235== by 0x38031E0E: panic (m_libcassert.c:319) 
==11235== by 0x38031E68: vgPlain_core_panic_at (m_libcassert.c:324) 
==11235== by 0x38031E7A: vgPlain_core_panic (m_libcassert.c:329) 
==11235== by 0x3804D162: failure_exit (m_translate.c:708) 
==11235== by 0x380D4C38: vex_assert_fail (main_util.c:219) 
==11235== by 0x380D3009: LibVEX_Translate (main_main.c:319) 
==11235== by 0x3804AACE: vgPlain_translate (m_translate.c:1559) 
==11235== by 0x38079D9F: vgPlain_scheduler (scheduler.c:991) 
==11235== by 0x380A6409: run_a_thread_NORETURN (syswrap-linux.c:103) 

sched status: 
running_tid=1 

Thread 1: status = VgTs_Runnable 
==11235== at 0x4000B00: ??? (in /lib64/ld-2.12.so) 
==11235== by 0x2: ??? 
==11235== by 0x7FF00036E: ??? 
==11235== by 0x7FF000386: ??? 
==11235== by 0x7FF000389: ??? 

Может кто-нибудь помочь с тем, как найти ошибку из этого сообщения и что может быть возможным?

+1

Для segfaults, как правило, «легче» запускать под отладчиком, а затем перемещаться вверх/вниз по кадру, чтобы увидеть вызовы, вызывающие проблемы. Есть [некоторые подсказки] (http://bioconductor.org/developers/how-to/c-debugging/). –

+0

Valgrind 3.8.1 теперь довольно старый. Итак, первое, что нужно попробовать - это перейти на новую версию (3.11.0), которая a.o. будет поддерживать более новые процессоры/hwcaps и/или будет иметь меньше ошибок :) – phd

+0

Я установил Valgrind через yum install. Не уверен, что он подбирает старую версию. – Ravi

ответ

1

Похоже, что используется assert(), который, согласно Writing R Extension, не должен использоваться в первую очередь.

Теперь почему assert() оценивает, как он это делает, и, следовательно, прерывание - это другое дело. Но для этого нужен минимально воспроизводимый пример, плюс некоторое свободное время и терпение.

+0

Спасибо Дирк. Из ответа Кевина в следующем потоке, похоже, проблема связана с другой функцией SfSparseVector. http://stackoverflow.com/questions/33500363/svm-using-rsofia-crashes-r – Ravi

+0

Да, и ваше использование valgrind никогда не было прав, чтобы исследовать segfault. –

+0

Dirk ... К сожалению, я наткнулся на несколько ссылок, которые направляли меня в этом направлении. Один из них находится здесь: http://thomas-cokelaer.info/blog/2013/03/using-valgrind-to-debug-r-programs/ – Ravi

Смежные вопросы