【问题标题】:General Protection Fault when using Valgrind使用 Valgrind 时的一般保护错误
【发布时间】:2020-09-14 03:26:20
【问题描述】:

由于我无权添加代码,请提前致歉。

我有一个程序在使用 Valgrind massif 工具启动 2-10 秒后在某些系统上崩溃。 使用 gdb 运行相同或按原样运行应用程序不会导致任何崩溃。

这很好用 - valgrind --tool=massif --pages-as-heap=yes ./<prog> <prog_args>

这会导致程序使用 SIGSEGV 中止 valgrind --tool=massif --stacks=yes ./<prog> <prog_args>

程序以 Valgrind 终止时,traceback 顶部的函数是这样的,行号指向带有标志的 if 条件语句:

<enum_type>
tmr_fn(ctx *ctx, tmr_t *tmr, const char *fn, unsigned int ln)
{
    int ret = ENUM_0
    if (ctx == NULL || tmr == NULL)
        return (ENUM_ERR);

    if (tmr->flags & 0x1) {
        tmr->flags |= 0x2;
        return (0);
    }
...
}

我尝试寻找答案,但还没有找到任何有用的东西。任何帮助或指点都会非常棒!

【问题讨论】:

  • 您使用的是哪个操作系统和哪个版本的 Valgrind?
  • 另外,您的可执行文件是否使用 memcheck 运行干净?在使用其他工具之前,您应该始终确保应用程序是干净的。
  • @PaulFloyd 我正在使用 Centos 6.5。正如您所说的那样,我使用 memcheck 运行并看到一个未初始化的值。 tmr 结构已声明,但可能有垃圾值并且正在被释放。

标签: segmentation-fault gdb valgrind massif


【解决方案1】:

使用 memcheck 运行程序显示未初始化的值。我发现已经声明了 tmr 结构,但是 memset 没有完成并且有一些垃圾值。这会导致在释放例程中调用的 tmr_fn 出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多