c - GDB 核心调试建议传递给函数的指针在调用后变为 NULL

标签 c linux memory gdb stack

我知道这个标题听起来有多奇怪。我无法轻松地重现该问题,因为它是一个加载了许多库的 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。

关于进一步研究的地方有什么想法吗?

最佳答案

The caller calls mkChar() with value 0x4cf39c0

不知道

tzname[0] 中的值目前0x4cf39c0,但在调用时可能有不同的值。

如果应用程序是多线程的,您可能会点击 this错误。

关于c - GDB 核心调试建议传递给函数的指针在调用后变为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323524/

相关文章:

c - C getopt 和 getopt_long 是否仅适用于主要参数?

c - 父进程和子进程,如果一个退出,如何通知另一个退出?

php - 合并 2 个非常大的文本文件,更新每一行,不使用内存

c - 为什么这个查找字符串中第一个唯一字符的 C 程序太慢了?

c - 在多线程上下文中,随机生成器的替代方案与 erand48() 一样快?

linux - 通过 Bash 更改 txt 文件

linux - 将我所有的文件上传到 GitHub

python - 逻辑回归内存错误

memory - glGenTextures 速度和内存问题

c - 如何修改文件 'jonesforth.S' 以便它可以返回到 C 调用函数而不导致段错误?