libcurl在空闲时间后出现奇怪的崩溃问题

8

我使用libcurl进行FTP工作,一切正常,但如果闲置一段时间它就会崩溃。以下是回溯信息,尽管我已经读了一段时间,但我无法理解出错的原因。跟踪没有显示我的函数中哪里崩溃,所以调试器让我束手无策。如果需要,我使用线程。

编译器是Linux上的GCC 4.7。

0  0x00007fff8e09b524  addbyter  /home/stefano/Desktop/myproject/curl-7.33.0/lib/mprintf.c  914
1  0x00007fff8e09a32f  dprintf_formatf  /home/stefano/Desktop/myproject/curl-7.33.0/lib/mprintf.c  572
2  0x00007fff8e09b5a4  curl_mvsnprintf  /home/stefano/Desktop/myproject/curl-7.33.0/lib/mprintf.c  932
3  0x00007fff8e089510  Curl_failf  /home/stefano/Desktop/myproject/curl-7.33.0/lib/sendf.c  152
4  0x00007fff8e07dbf4  Curl_resolv_timeout  /home/stefano/Desktop/myproject/curl-7.33.0/lib/hostip.c  618
5  0x00007fff78012bf8  ??    
6  0x000000c300000016  ??    
7  0x00007fff8e0d3604  ??    
8  0x0000000000000002  ??    
9  0x00000000001b7740  ??    
10  0x0000000000000000  ??    

更新1 在调试器下再次运行它时,在该行遇到了崩溃

FILE *fd; 
fd = fopen(files[i].c_str(), "rb"); //<---here goes the crash!

files[i].c_str()应该从wxString返回const* char

新的BT是

0  0x00007fff8e08952a  Curl_failf  /home/stefano/Desktop/myproject/curl-7.33.0/lib/sendf.c  154
1  0x00007fff8e07dbf4  Curl_resolv_timeout  /home/stefano/Desktop/myproject/curl-7.33.0/lib/hostip.c  618
2  0x00007fff780158c8  ??    
3  0x00000000001b7730  ??    
4  0x00007fff78009808  ??    
5  0x00007fff78015e79  ??    
6  0x00007fff78009808  ??    
7  0x00007fff8c8a04a0  ??    
8  0x00007fff8e0c84ca  ftp_multi_statemach  /home/stefano/Desktop/myproject/curl-7.33.0/lib/ftp.c  3113

4
在您的代码中,似乎已经破坏了内部的malloc()结构,这很可能是由于某处未分配足够空间所致。请使用valgrind编译您的代码,并检查是否会抛出任何错误。 - Guntram Blohm
我使用C++,不进行任何分配。我正在尝试探测并查看这是从哪里上升的。我将尝试使用valgrind选项。 - Stefano Mtangoo
1
当您在调试器中遇到崩溃点时,请让调试器打印i。打印files[i]。打印files[i].c_str()。它们看起来都正常吗?如果i超出了数组范围,那么这很可能会解释崩溃的原因。 - Guntram Blohm
@BasileStarynkevitch,我使用的是4.7版本,所以无法使用fsanitize。我使用自己编译的libcurl调试版本。因此,我必须使用valgrind。 - Stefano Mtangoo
@GuntramBlohm,让我现在检查一下。 - Stefano Mtangoo
显示剩余4条评论
1个回答

17

如果您在非主线程中使用curl,则可能会导致此类错误。当curl无法解析dns条目时,它会发送一个信号(默认情况下)来通过超时中断线程。信号不是线程安全的,可能会导致崩溃。您应该使用--enable-threaded-resolver编译libcurl或支持c-ares。

对我来说,禁用信号也很有用。

curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1)

@Marcelo 很高兴能帮忙。这会节省我很多时间 :) - Ivan Fateev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接