我正在开发一个包含二进制文件的R包,它是用C / C ++代码编译的。该编译代码中的某些内容会导致Windows(7,64位)上的随机崩溃,但不会导致Linux(各种系统和配置)上的随机崩溃。我的R版本是2.15.0。
我不知道如何调试它,因为我无法弄清楚R崩溃时给出的信息:
Problem signature:
Problem Event Name: BEX64
Application Name: Rterm.exe
Application Version: 2.150.58871.0
Application Timestamp: 4f75a75a
Fault Module Name: StackHash_2264
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Offset: 0000000000000000
Exception Code: c0000005
Exception Data: 0000000000000008
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 1037
Additional Information 1: 2264
Additional Information 2: 2264db07e74365624c50317d7b856ae9
Additional Information 3: 875f
Additional Information 4: 875fa2ef9d2bdca96466e8af55d1ae6e
我可以从StackHash模块中的问题中学到什么吗?
其他一些信息:
根据R文档,我在Linux上运行Valgrind,它没有报告任何问题。我尝试了“gctorture”功能,但它似乎没有以任何方式影响bug的行为。
我在代码中使用pthread来利用多核CPU。当我禁用多线程的使用时(使用我所拥有的预处理器定义),问题似乎消失了,但我不能确定这是否真的消除了这个问题,或者只是让它不太可能发生。
我没有使用那么多应该在我正在使用的机器上造成麻烦的内存。我也有一些递归调用,但是再次似乎太少了,它会溢出堆栈,除非线程在Windows上得到非常有限的堆栈?
由于多线程随机性和bug的可能性很低,我很难用打印机将其隔离到控制台或日志文件。
任何指针都会非常感激
答案 0 :(得分:2)
我会在调试器中加载R,然后运行它直到它崩溃,然后看看它在哪里。
错误显然是空指针访问(0000000000000008引用NULL) - 我很确定它不是堆栈问题。
你应该能够看到它崩溃的地方。