【问题标题】:Debug compiled code for R on Windows在 Windows 上调试 R 的编译代码
【发布时间】:2012-12-23 07:56:49
【问题描述】:

我正在开发一个 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 模块中的问题中学到什么吗?

一些附加信息:

  1. 根据 R 文档,我在 Linux 上运行 Valgrind,它没有报告任何问题。我尝试了“gctorture”功能,但它似乎并没有以任何方式影响错误的行为。

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

  3. 我没有使用太多内存,这会在我正在使用的机器上造成问题。我也有一些递归调用,但似乎又太少了以至于它会溢出堆栈,除非线程在 Windows 上获得非常有限的堆栈?

  4. 由于多线程随机性和错误的低概率,我很难使用打印到控制台或日志文件来隔离它。

任何指针将不胜感激

【问题讨论】:

    标签: c r debugging


    【解决方案1】:

    我会在调试器中加载 R,然后运行它直到它崩溃,然后看看它在哪里。

    该错误显然是空指针访问(0000000000000008 引用的是 NULL) - 我很确定这不是堆栈问题。

    您应该能够看到它崩溃的位置。

    【讨论】:

    • 我尝试将它加载到 GDB 中,但它在没有 GDB 捕获它的情况下崩溃(说“退出了劣质进程”)。在 Windows 上正确让 GDB 与 R(+我的包 DLL)一起工作的过程是什么? (因为在 Linux 上不会出现问题)
    • @skauf windbg 捕获异常了吗?
    • 我可能会尝试使用 Windows 调试器 windbg - 搜索“MSDN windbg”。这似乎很好地描述了如何使 windbg 捕获“任何崩溃的应用程序”。 stackoverflow.com/questions/5638251/…
    • Windbg 确实将异常捕获为访问冲突,但没有符号信息告诉我它发生在哪里。我需要做什么才能获得此信息? (至少对于我自己的包的 DLL)。 windbg 是否处理多线程进程?
    • Windbag 应该处理多个线程,是的。至于符号,您自己构建了 R 吗?如果没有,你可能有点卡住了。如果您可以构建自己的版本,那么您应该有符号。也有可能你只需要告诉windbg符号在哪里!不是我见过的最好的布局站点,但告诉您如何设置符号路径,如果这是问题所在 - 但如果您没有“.pdb”文件,那么您需要从源构建或获取来自支持您的版本的人的 .pdb [确保它匹配,否则您会比没有符号更糟糕]
    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 2011-03-27
    • 2010-11-19
    • 1970-01-01
    • 2017-08-16
    • 2022-01-24
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多