段错误的g_slice_alloc(segfault in g_slice_alloc)

2019-10-17 17:57发布

我打电话用如下的功能:

void call_system_command(const char *command_params)
{
    GString *cmd = g_string_sized_new(1024);
    g_string_append_printf(cmd, "/bin/bash /path/to/my/script '%s'", command_params);
    system(cmd->str);
    g_string_free(cmd, TRUE);
}

我与g_string_sized_new线得到段错误。 回溯从GDB显示:

(gdb) bt
#0  0x000000320ce56264 in g_slice_alloc () from /lib64/libglib-2.0.so.0
#1  0x000000320ce5c3db in g_string_sized_new () from /lib64/libglib-2.0.so.0
....

我已经试过出口G_SLICE =永远的malloc,以便不用油腔滑调自己分配,使用的malloc。 然而问题依然相同。 我仍然在g_slice_alloc得到段错误。 我还特意打电话从多个线程这个功能“call_system_command”。 莫非有问题?

该功能是插件的一部分,由每15分钟叫和cron。 该段错误不会发生在每次执行插件时间,但每3-4天。

进一步调试任何指针将会很有帮助。

提前致谢。

Answer 1:

你应该运行你的应用程序Valgrind的下帮追这个,这听起来像堆损坏。

你提到的线程,这当然是好信息,因为它可以更容易陷入困境收场。

巧舌如簧文档状态:

GLib的本身是完全内部线程安全(全球所有数据将被自动锁定),但个别数据结构的情况下,不会自动锁定性能的原因。

而且,由于切片API不公开任何数据结构的情况下,它应该是安全的从多个线程调用。



Answer 2:

我发现这个问题。 写了下面的测试程序,以确定问题。

#include <stdio.h>
#include <glib.h>
#include <pthread.h>

#pragma GCC optimize("O0")

#define NUM 20
void* run(void *d)
{
    int i;
    for (i = 0; i < 1000000; i++) {
        GString *str = g_string_sized_new(1024);
        g_string_append_printf(str, "%s", "hello hello\n");
        fprintf(stdout, "%s", str->str);
        g_string_free(str, TRUE);
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t threads[NUM];
    int j;
    for (j = 0; j < NUM; j++) {
        pthread_create(&threads[j], NULL, run, (void*) NULL);
    }
    pthread_exit(NULL);

    return 0;
}

下面段错误持续发生

计划接收信号SIGSEGV,分割过错。 从/lib64/libglib-2.0.so.0缺少单独debuginfos [切换主题0x7fffecdfa700(LWP 11277)]在0x000000320ce56257 g_slice_alloc(),使用:debuginfo软安装glib2-2.22.5-6.el6.x86_64的glibc-2.12- 1.47.el6.x86_64 libgcc中,4.4.6-3.el6.x86_64



Answer 3:

哪里是你pthread_join说法? 你的主要功能您的线程函数返回前居然可以完成 - 这可能会破坏该线程对象themselfes。 据我知道pthread_exit是应该在产生的线程中使用,而不是mainthread内( http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.html , HTTP:// man7。组织/ LINUX /人-页/ man3 / pthread_exit.3.html ),所以您的演示是(可能)不是最佳的,并且可以结合相同的问题,事业为你的程序。

你有没有尝试只是手动malloc的内存相同大小的一群,用的valgrind和gdb再次检查。



文章来源: segfault in g_slice_alloc