2017-10-15 76 views
0

我嘗試使用curl在c中編寫的守護進程中下載一個feed文件。curl_global_init上的SIGSEV調用

當我打電話curl_global_init(CURL_GLOBAL_ALL),並按照使用gdb我收到以下錯誤的調用:

Thread 2.1 "showiumize" received signal SIGSEGV, Segmentation fault. 
0x00007ffff781e6b2 in tcache_get() from /usr/lib/libc.so.6 

什麼我做錯了任何想法?

+1

[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)在哪裏?我們應該怎樣才能讀懂你的想法,你可能會做錯什麼? –

+0

我試圖生成一個,但我不能。我認爲這個問題可能出現在我不明白的關於libc的錯誤消息中。 –

+0

除了一個MCVE,它將很高興知道*在你的*代碼中哪裏發生了崩潰。在調試器中捕捉它,然後遍歷函數調用堆棧,直到進入代碼。我建議你花一些時間閱讀Eric Lippert的[如何調試小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至於消息,除了*可能*你有某種指針錯誤之外,它並沒有真正告訴我們什麼。 –

回答

0

我發現了什麼問題。因爲它是一個守護進程,所以在執行開始時我關閉了stdout和stderr。但是,顯然你不能沒有這些就開始捲曲。一個最小的,完整的和可覈查的例子是這樣的:

#include <curl/curl.h> 
#include <stdio.h> 

int main(void) { 
    fclose(1); 
    curl_global_init(CURL_GLOBAL_ALL); 
    return 0; 
} 

的例子應該提供一個SIGSEV。我猜libcurl試圖寫入標準輸出。

+0

請注意,像這樣關閉stdout幾乎總是做錯事情,很多庫,甚至是標準庫調用,都希望打開stdin/out/err。而是將stdout/err重定向到/ dev/null,例如調用freopen(「/ dev/null」,「w」,stdout);' – nos