2015-10-29 11 views
6

のプロファイリングとhs_init使用しているとき、私はgccでコンパイルする必要があり、大きなCのプロジェクトを持っています。だから私はこのようにファイルをメインの実行ファイルをリンク:GHC RTSのランタイムエラー共有徒党ライブラリ

期待どおりに動作
#include <HsFFI.h> 

static void my_enter(void) __attribute__((constructor)); 
static void my_enter(void) { 
    static char *argv[] = { "Pointer.exe", 0 }; 
    //static char *argv[] = { "Pointer.exe", "+RTS", "-N", "-p", "-s", "-h", "-i0.1", "-RTS", 0 }; 
    static char **argv_ = argv; 
    static int argc = 1; // 8 for profiling 
    hs_init(&argc, &argv_); 
    //hs_init_with_rtsopts(&argc, &argv_); 
} 

static void my_exit(void) __attribute__((destructor)); 
static void my_exit(void) { hs_exit(); } 

- GHCのランタイムシステムが初期化されると、私は

C.

からHaskellコードを呼び出すためにFFIを使用することができますよ私は、上記のコメントアウト行に "+RTS", "-N", "-p", "-s", "-h", "-i0.1", "-RTS"フラグを使用して、コードカバレッジ(HPC)(主に Debug.Traceとスタックトレース用)プロファイリングを可能にすることを試みます。しかし、私は、初期化時のスレッドとプロファイリングに関するエラーメッセージが出ます:

Pointer.exe: the flag -N requires the program to be built with -threaded 
Pointer.exe: the flag -p requires the program to be built with -prof 
Pointer.exe: Most RTS options are disabled. Use hs_init_with_rtsopts() to enable them. 
Pointer.exe: newBoundTask: RTS is not initialised; call hs_init() first 

私は徒党パッケージを構成し:

適切の一部としてコンパイルされた実行ファイルを実行しているとき、私はトレースとコードカバレッジを積み重ね与えている
"--enable-library-profiling" 
"--enable-executable-profiling" 
"--enable-shared" 
"--enable-tests" 
"--enable-coverage" 

キャバールプロジェクト

私は、エラーメッセージが推奨するようhs_init_with_rtsoptsを使用しようとすると、私はGHCのRTSの初期化中にSIGSEGVを取得:

Using host libthread_db library "/usr/lib/libthread_db.so.1". 

Program received signal SIGSEGV, Segmentation fault. 
0x00007ffff6a2d0ca in strlen() from /usr/lib/libc.so.6 
(gdb) bt 
#0 0x00007ffff6a2d0ca in strlen() from /usr/lib/libc.so.6 
#1 0x00007ffff798c5f6 in copyArg (
    arg=0x657372615062696c <error: Cannot access memory at address 0x657372615062696c>) at rts/RtsFlags.c:1684 
#2 0x00007ffff798c679 in copyArgv (argc=8, argv=0x555555554cee) at rts/RtsFlags.c:1696 
#3 0x00007ffff798dbe2 in setFullProgArgv (argc=<optimized out>, argv=<optimized out>) at rts/RtsFlags.c:1780 
#4 0x00007ffff798e773 in hs_init_ghc (argc=0x555555756090 <argc>, argv=0x5555557560a0 <argv>, rts_config=...) 
    at rts/RtsStartup.c:162 
#5 0x00007ffff798e7cc in hs_init_with_rtsopts (argc=<optimized out>, argv=<optimized out>) 
    at rts/RtsStartup.c:121 
#6 0x0000555555554c7d in __libc_csu_init() 
#7 0x00007ffff69cc59f in __libc_start_main() from /usr/lib/libc.so.6 
#8 0x0000555555554b29 in _start() 

は、どのように私はgccでコンパイルされたプログラムから実行時のプロファイリングを有効にすることができますか?

+0

実際のプログラムからCコードをコピー&ペーストしていますか?特に、 'hs_init_with_rtsopts(&argc、&argv_)'に 'argv'のあちこちに'& 'と' _'をつけたのは本当ですか? gdbの出力と互換性がありません。 –

+0

スレッドとプロファイリングの場合は、RTS( 'HSrts_thr_p')のスレッドとプロファイリングされたバージョンにリンクする必要があります。 –

+0

私は '-lHSrts-ghc7.10.2'とリンクしていました。 'HSrts_thr_p'を使ってみましょう。 – KarlC

答えて

1

だから、セグメンテーション違反が問題に含まれていなかったタイプミスによるものでした。卑劣なこと!

スレッドおよびプロファイリングを有効にするので、あなたに適切なRTS風味に対するあなたの最終的なプログラムをリンクする必要があります。これは、1つのGHCの-prof旗の効果、及びその-threadedフラグの唯一の効果、および-debugのような様々な他のフラグです。

RTS風味が左のフォーム

libHSrts.a   libHSrts-ghc7.8.4.so  (vanilla) 
libHSrts_debug.a  libHSrts_debug-ghc7.8.4.so (debug) 
libHSrts_thr.a  libHSrts_thr-ghc7.8.4.so (threaded) 
libHSrts_p.a   -       (profiling) 
libHSrts_thr_p.a  -       (threaded+profiling) 
libHSrts_l.a   libHSrts_l-ghc7.8.4.so  (eventlog) 
... 

の名前と異なるライブラリにあるが、静的ライブラリです。右側に動的ライブラリがあります。ライブラリ名にはGHCバージョンが含まれているため、複数のバージョンのGHCがインストールされている場合、ランタイム動的ローダが正しいバージョンを見つけやすくなります。あなたはghc --infoの "RTS方法"の下でGHCインストールの完全なリストを見ることができます。

デフォルトでインストールされている動的プロファイリングライブラリはありませんが、基本的な問題はなく、GHCビルドシステムを構築して構築することができます。 (ghciはプロファイリングをサポートしていないため、すぐにはうまくいきませんから、特に有用ではありません)

+0

Yep - 正しい '.so'ファイルを取得するためにghcを自分でビルドする必要がありますが、スレッド化されたバージョンの1つを使ってスレッド化メッセージを取り除き、ghcをコンパイルする機会を得てください。 – KarlC

関連する問題