我正在使用以下行调用函数:
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的Backtrace显示:
(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 = always-malloc,因此不使用glib自己的分配器,而是使用malloc。但问题仍然存在。 我仍然在g_slice_alloc中遇到段错误。 我也从多个线程调用此函数'call_system_command'。 这可能是个问题吗?
该函数是插件的一部分,每15分钟由cron调用一次。每次执行插件时都不会发生段错误,但每隔3-4天就会发生一次。
有关进一步调试的任何指示都会有所帮助。
提前致谢。
答案 0 :(得分:0)
你应该在Valgrind下运行你的应用程序以帮助追逐它,这听起来像堆腐败。
你提到线程,这当然是很好的信息,因为它可以让你更容易陷入困境。
glib文档声明:
GLib本身在内部完全是线程安全的(所有全局数据都会自动锁定),但出于性能原因,各个数据结构实例不会自动锁定。
由于切片API不公开任何数据结构实例,因此从多个线程调用应该是安全的。
答案 1 :(得分:0)
我发现了问题。写下以下测试程序来确定问题。
#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,分段故障。 [切换到线程0x7fffecdfa700(LWP 11277)] 来自/lib64/libglib-2.0.so.0的g_slice_alloc()中的0x000000320ce56257 缺少单独的debuginfos,请使用:debuginfo-install glib2-2.22.5-6.el6.x86_64 glibc-2.12-1.47.el6.x86_64 libgcc-4.4.6-3.el6.x86_64
答案 2 :(得分:0)
您的pthread_join
声明在哪里?你的主函数实际上可以在你的线程函数返回之前完成 - 这可能会破坏自己的线程对象。据我所知pthread_exit
应该在生成的线程中仅使用 ,而不是在主线程中使用http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.html,http://man7.org/linux/man-pages/man3/pthread_exit.3.html)
因此,您的演示(可能)不是最佳的,并且可能包含与您的程序相同的问题。
您是否尝试手动malloc
相同大小的内存并再次使用valgrind和gdb进行检查。