2013-02-25 51 views
1

我打電話用如下的功能:段錯誤的g_slice_alloc

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天發生一次。

任何關於進一步調試的指針都會有幫助。

在此先感謝。

+0

請給我們展示一個最小的,可編譯的測試用例。 「最小」意味着「僅使用重現此問題所需的基本要素」,「可編譯」意味着「能夠在我們的系統上進行編譯和調試,而無需填寫空白或修復基本的語法錯誤」。 – Sebivor 2013-02-25 09:51:19

回答

0

你應該在Valgrind下運行你的應用程序來幫助追逐它,這聽起來像堆腐敗。

你提到了線程,這當然是很好的信息,因爲它可以使它更容易陷入困境。

圓滑的文檔狀態:

GLib的本身是完全內部線程安全(全球所有數據將被自動鎖定),但個別數據結構的情況下,不會自動鎖定性能的原因。

由於切片API不公開任何數據結構實例,所以從多個線程調用應該是安全的。

+0

在valgrind中運行插件會讓它太慢。這將需要數小時才能完成。我試着通過測試程序在valgrind中運行函數,但無法重現段錯誤。 – user434345 2013-02-25 09:29:57

+0

...... valgrind告訴你什麼?它有沒有提到任何問題?如果不是的話,那麼你就誤診了,你需要擴大你的視野,因爲錯誤在別處。 – Sebivor 2013-02-25 10:14:44

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)] 0x000000320ce56257 g_slice_alloc()from /lib64/libglib-2.0.so.0 缺少單獨的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

0

您的pthread_join聲明在哪裏?你的主函數實際上可能會在你的線程函數返回之前完成 - 這可能會破壞線程對象本身。據我所知pthread_exit應該只使用的產生的線程中,而不是mainthread(http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.htmlhttp://man7.org/linux/man-pages/man3/pthread_exit.3.html) 那麼您的演示是(可能)不是最佳的,並且可以結合相同的問題,原因是你的程序中。

你是否試圖手動malloc相同大小的一堆內存,並再次用valgrind和gdb檢查。