【问题标题】:Mysterious linux backtrace and memory map神秘的linux回溯和内存映射
【发布时间】:2018-05-24 07:18:38
【问题描述】:

在处理内存分配、valgrind 和 gdb 时,我不得不编写一个带有无效 free 的简单 c 程序:

#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    int* arr = (void*) malloc(100 * sizeof(int));
    arr[50] = 10;
    free(arr + (20 * sizeof(int)));
    printf("arr[50] = %d\n", arr[50]);
    return 0;
}

根据需要产生错误:

*** Error in `./allocWithFunnyFree': free(): invalid pointer: ... ***
======= Backtrace: =========
...
======= Memory map: ========
...

然后我尝试通过将sdtoutstderr 重定向到/dev/null 来消除输出,但注意到输出仍然会被打印出来,这让我感到困惑。

我在使用调试器调用free() 之前停止了程序一条指令,查找了/proc/PID/fd 目录并再次尝试将所有列出的fd 重定向到/dev/null,但结果仍然相同..

我在网上搜索了答案并询问了我的一些同事,但没有人能向我解释这个输出是如何打印的以及为什么它不能被重定向。

当然,关于操作系统/linux,我还有很多不知道的地方,但我希望你能帮助我了解这里发生了什么。
谢谢!

【问题讨论】:

    标签: c linux memory-management linux-kernel free


    【解决方案1】:

    回溯(在 glibc 中)are printed to /dev/tty,它将是与 1 和 2 不同的文件描述符(在您的程序中将是 3),并且您的 shell 不知道它。

    Glibc 提供了一个环境变量LIBC_FATAL_STDERR_,您可以使用它将其重定向到其他地方。例如,您可以使用以下命令将回溯重定向到 stderr:

    $ export LIBC_FATAL_STDERR_=2
    $ ./allocWithFunnyFre 2>free_backtrace
    

    如果您在strace 下运行您的程序,您可以更好地理解它(以及如何编写回溯)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 2013-09-02
      • 1970-01-01
      • 2013-07-25
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多