0

事先为不添加代码道歉,因为我没有这样做的权限。

我有一个程序在使用 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 终止时,回溯顶部的函数如下所示,行号指向带有标志的 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);
    }
...
}

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

4

1 回答 1

0

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

于 2020-05-28T08:37:21.917 回答