我知道这个名字听起来有多奇怪我不能轻松地重现这个问题,因为它是一个加载了许多库的R脚本,而且每月只崩溃一次,甚至更少。但当它崩溃时,它总是在同一行上给出相同的错误。我将跳过R部分,并演示gdb trace如何显示令人困惑的值。
R中的C代码段:

// datetime.c
...   SEXP attribute_hidden do_asPOSIXlt(SEXP call, SEXP op, SEXP args, SEXP env)
...   {
705       SET_STRING_ELT(tzone, 1, mkChar(tzname[0]));
... ...

// envir.c
3723  SEXP mkChar(const char *name)
3724  {
3725      size_t len = strlen(name);
... ...

其中tzname是全局变量。
下面是gdb核心调试:
gdb /usr/lib64/R/bin/exec/R ~/core.30387
(gdb) bt 3
#0  0x00007f1dca844ff1 in __strlen_sse2_pminub () from /lib64/libc.so.6
#1  0x00007f1dcb20e8f9 in mkChar (name=0x0) at envir.c:3725
#2  0x00007f1dcb1dc225 in do_asPOSIXlt (call=<optimized out>,
op=<optimized out>, args=<optimized out>,
    env=<optimized out>) at datetime.c:705
(More stack frames follow…)
(gdb) frame 1
#1  0x00007f1dcb20e8f9 in mkChar (name=0x0) at envir.c:3725
3725    envir.c: No such file or directory.
(gdb) p name
$1 = 0x0
(gdb) frame 2
#2  0x00007f1dcb1dc225 in do_asPOSIXlt (call=<optimized out>, op=<optimized out>, args=<optimized out>,
    env=<optimized out>) at datetime.c:705
705 datetime.c: No such file or directory.
(gdb) p tzname[0]
$2 = 0x4cf39c0 "CST"

调用方使用值0x4cf39c0调用mkChar(),但是,根据gdb,它在被调用方的上下文中变为NULL(0x0)。我知道这可能是内存问题,但如果某个R库弄乱了内存,则tzname应该为零或无效。让我感到困惑的是,在调用之后,传递给mkChar的参数(指针tzname[0])似乎以某种方式“更改”(如果确实是更改)为NULL。
你知道在哪里可以进一步调查吗?

最佳答案

调用方使用值0x4cf39c0调用mkChar()
你不知道。
tzname[0]中的值当前为0x4cf39c0,但在调用时可能具有不同的值。
如果应用程序是多线程的,则可能遇到了this错误。

09-10 09:31
查看更多