Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2407553
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类: C/C++

2012-10-30 15:35:21

http://fool.is-programmer.com/2011/3/26/libcurl-signal-bug.25603.html

今天运气不错,解决了两个非常棘手的Bug,这一个是关于libcurl的。

我的程序在一个线程中执行主循环,需要从网络下载东西时,就开启另一个线程,执行curl_easy_perform。问题是,程序在执行一段时间后会自己崩溃掉,backtrack如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#0  0x4001e416 in __kernel_vsyscall ()
#1  0x40491941 in raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2  0x40494e42 in abort () at abort.c:92
#3  0x404c9305 in __libc_message (do_abort=2,
    fmt=0x4059f36a "*** %s ***: %s terminated\n")
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:189
#4  0x4054c970 in __fortify_fail (msg=)
    at fortify_fail.c:32
#5  0x4054c8da in ____longjmp_chk ()
    at ../sysdeps/unix/sysv/linux/i386/____longjmp_chk.S:76
#6  0x4054c849 in __longjmp_chk (env=, val=1)
    at ../setjmp/longjmp.c:40
#7  0x4020dd08 in alarmfunc () from /usr/lib/libcurl-gnutls.so.4
#8 
#9  0x4001e416 in __kernel_vsyscall ()
#10 0x4004b930 in sem_wait@GLIBC_2.0 ()
    at ../nptl/sysdeps/unix/sysv/linux/i386/i686/../i486/sem_wait.S:318
#11 0x400fa7ac in PeekMessageEx (pMsg=0xbffff0b8, hWnd=134580240,
    iMsgFilterMin=0, iMsgFilterMax=0, bWait=1, uRemoveMsg=1) at message.c:628
#12 0x0804b45f in GetMessage (this=0xbffff104)
    at /usr/local/include/minigui/window.h:1935
#13 WeiboUI::Application::run (this=0xbffff104) at application.cc:99
#14 0x08049df0 in MiniGUIAppMain (argc=1, argv=0xbffff274) at main.cc:56
#15 0x08049f4c in main (args=1, argv=0xbffff274) at main.cc:56

简单说明一下,就是主循环在执行sem_wait時,被一个信号打断,然后导致整个程序的崩溃。问题的关键就在那个alarmfunc (),是libcurl打断了我的循环。

最后以alarmfunc为关键词搜索后才发现,原来libcurl居然使用alarm来实现超时的判断!在多线程环境里,alarm产生的信号会打断一切主循环,然后导致非常难以察觉的Bug。

解决方法很简单,把CURLOPT_NOSIGNAL设为1就行了,这样libcurl将不会产生任何信号:

http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTNOSIGNAL

阅读(6755) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~