のプロファイリングと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でコンパイルされたプログラムから実行時のプロファイリングを有効にすることができますか?
実際のプログラムからCコードをコピー&ペーストしていますか?特に、 'hs_init_with_rtsopts(&argc、&argv_)'に 'argv'のあちこちに'& 'と' _'をつけたのは本当ですか? gdbの出力と互換性がありません。 –
スレッドとプロファイリングの場合は、RTS( 'HSrts_thr_p')のスレッドとプロファイリングされたバージョンにリンクする必要があります。 –
私は '-lHSrts-ghc7.10.2'とリンクしていました。 'HSrts_thr_p'を使ってみましょう。 – KarlC