2017-10-15 71 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

相关问题