C 在Windows上调试R的编译代码

C 在Windows上调试R的编译代码,c,r,debugging,C,R,Debugging,我正在开发一个R包,它包含一个二进制代码,由C/C++代码编译而成。编译代码中的某些东西会在Windows(764位)上导致随机崩溃,但在Linux(各种系统和配置)上不会。我的R版本是2.15.0 我不知道如何调试它,因为我无法理解R崩溃时给出的信息: Problem signature: Problem Event Name: BEX64 Application Name: Rterm.exe Application Version: 2.150.58871.0 App

我正在开发一个R包,它包含一个二进制代码,由C/C++代码编译而成。编译代码中的某些东西会在Windows(764位)上导致随机崩溃,但在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,它没有报告任何问题。我尝试了“gc折磨”功能,但它似乎没有以任何方式影响bug的行为

  • 我在代码中使用pthreads来利用多核CPU。当我禁用多线程(使用我已经定义的预处理器)时,问题似乎消失了,但我不能确定这是否真的消除了问题,或者只是降低了问题发生的可能性

  • 我没有使用太多的内存,这会给我正在使用的机器带来麻烦。我也有一些递归调用,但似乎太少,它会溢出堆栈,除非线程在Windows上得到非常有限的堆栈

  • 由于多线程的随机性,以及bug的低概率,我很难使用控制台或日志文件的打印来隔离它


  • 任何指针都会很受欢迎

    我会在调试器中加载R,然后运行它直到崩溃,然后查看它的位置

    这个错误显然是一个空指针访问(0000000000000008引用了一个空指针)-我很确定这不是堆栈问题


    您应该能够看到它在哪里崩溃

    我尝试在GDB中加载它,但它在GDB没有捕获它的情况下崩溃了(比如说“劣质进程退出”)。让GDB在Windows上正确使用R(+my package DLL)的过程是什么?(因为在Linux上没有出现问题)@skauf windbg是否捕获异常?我可能会尝试使用Windows调试器windbg-搜索“MSDN windbg”。这似乎很好地描述了如何让windbg捕获“任何崩溃的应用程序”。Windbg确实将异常捕获为访问冲突,但没有符号信息来告诉我它发生在哪里。我需要做什么才能获得这些信息?(至少对于我自己的包的DLL)。windbg处理多线程进程吗?Windbag应该处理多线程,是的。至于符号,是你自己造的吗?如果没有,你可能有点卡住了。如果您可以构建自己的版本,那么您应该有符号。也有可能您只需告诉windbg符号在哪里!这不是我见过的布局最好的网站,但它告诉你如何设置符号路径,如果这是问题所在-但是如果你没有“.pdb”文件,那么你需要从源代码中构建,或者从创建你的版本的人那里获取.pdb[确保它匹配,否则你会比没有符号更糟糕]