我打电话用如下的功能:
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天。
进一步调试任何指针将会很有帮助。
提前致谢。
你应该运行你的应用程序Valgrind的下帮追这个,这听起来像堆损坏。
你提到的线程,这当然是好信息,因为它可以更容易陷入困境收场。
巧舌如簧文档状态:
GLib的本身是完全内部线程安全(全球所有数据将被自动锁定),但个别数据结构的情况下,不会自动锁定性能的原因。
而且,由于切片API不公开任何数据结构的情况下,它应该是安全的从多个线程调用。
我发现这个问题。 写了下面的测试程序,以确定问题。
#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
哪里是你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再次检查。