将 hs_init 用于共享 cabal 库的分析时出现 GHC RTS 运行时错误
GHC RTS runtime errors when using hs_init with profiling of shared cabal library
我有一个必须用 gcc 编译的大型 C 项目。所以我 link 主可执行文件有这样一个文件:
#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 运行时系统已初始化,我可以使用 FFI 从 C 调用 Haskell 代码。
然后,我尝试使用上面注释掉的行上的 "+RTS", "-N", "-p", "-s", "-h", "-i0.1", "-RTS"
标志启用分析(主要针对具有 Debug.Trace
的堆栈跟踪)和代码覆盖率 (HPC)。但是我在初始化期间收到有关线程和分析的错误消息:
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
我配置了 cabal 包:
"--enable-library-profiling"
"--enable-executable-profiling"
"--enable-shared"
"--enable-tests"
"--enable-coverage"
当 运行 可执行文件编译为 cabal 项目的一部分时,它正确地为我提供了堆栈跟踪和代码覆盖率。
如果我尝试按照错误消息的建议使用 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 编译的程序启用运行时分析?
所以段错误是由于问题中没有包含的错字造成的。鬼鬼祟祟!
要启用线程和分析等功能,您必须 link 您的最终程序符合适当的 RTS 风格。这是 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 ways" 下查看 GHC 安装的完整列表。
默认情况下没有安装动态分析库,但我认为拥有它们没有根本问题,您可以配置 GHC 构建系统来构建它们。 (它们现在不是特别有用,因为 ghci 不支持分析,但希望很快就会改变。)
我有一个必须用 gcc 编译的大型 C 项目。所以我 link 主可执行文件有这样一个文件:
#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 运行时系统已初始化,我可以使用 FFI 从 C 调用 Haskell 代码。
然后,我尝试使用上面注释掉的行上的 "+RTS", "-N", "-p", "-s", "-h", "-i0.1", "-RTS"
标志启用分析(主要针对具有 Debug.Trace
的堆栈跟踪)和代码覆盖率 (HPC)。但是我在初始化期间收到有关线程和分析的错误消息:
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
我配置了 cabal 包:
"--enable-library-profiling"
"--enable-executable-profiling"
"--enable-shared"
"--enable-tests"
"--enable-coverage"
当 运行 可执行文件编译为 cabal 项目的一部分时,它正确地为我提供了堆栈跟踪和代码覆盖率。
如果我尝试按照错误消息的建议使用 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 编译的程序启用运行时分析?
所以段错误是由于问题中没有包含的错字造成的。鬼鬼祟祟!
要启用线程和分析等功能,您必须 link 您的最终程序符合适当的 RTS 风格。这是 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 ways" 下查看 GHC 安装的完整列表。
默认情况下没有安装动态分析库,但我认为拥有它们没有根本问题,您可以配置 GHC 构建系统来构建它们。 (它们现在不是特别有用,因为 ghci 不支持分析,但希望很快就会改变。)