【问题标题】:libcurl strange crashes after Idle time空闲时间后 libcurl 奇怪的崩溃
【发布时间】:2014-01-17 01:56:25
【问题描述】:

我使用 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 再次在debugger下运行,在行遇到crash

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

【问题讨论】:

  • 在我看来,这似乎是您在代码中的某处损坏了内部 malloc() 结构,这很可能是由于在某处分配的空间不足所致。用 valgrind 编译你的代码并检查它是否抛出任何错误。
  • 我使用 C++,不做任何分配。我正在尝试探索并查看 ths 是从哪里上升的。我会尝试 valgrind 选项
  • 抱歉,没有看到 c++ 标签。尽管如此,写入一个也不应该在 c++ 中写入的内存位置也很容易。根据我的经验,通常运行良好的库中的崩溃大多是由这种错误触发的,这就是我建议它的原因。
  • @GuntramBlohm,我已经更新了我的问题并添加了一些信息。你能从那里给任何方向吗?我对 Cand 很浅,尽量避免使用 C 库,但这次我不能
  • 当您在调试器中处于崩溃点时,让调试器打印 i。打印文件[i]。打印文件[i].c_str()。你觉得他们都好吗?如果i 超出数组范围,这将很好地解释崩溃。

标签: c++ gcc gdb wxwidgets libcurl


【解决方案1】:

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

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

curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1)

【讨论】:

  • @Marcelo 很乐意帮助队友。它会为我节省很多时间:)
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 2015-11-03
  • 2023-03-25
  • 1970-01-01
  • 2013-11-16
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多