2011-08-19 77 views
2

由於某些未知原因,我的應用程序使用libcurl崩潰。在使用Guard Malloc時,它在相同代碼的許多循環後自發崩潰。libcurl(7.19,7)在OSX上使用_mdns_query_callback崩潰(10.6.8)

的libcurl版本信息:

捲曲7.19.7(通用蘋果darwin10.0)的libcurl/7.19.7的OpenSSL/0.9.8r 的zlib/1.2.3協議:TFTP FTP遠程登錄字典LDAP HTTP文件HTTPS FTPS 特點:GSS-協商的IPv6 Largefile NTLM SSL libz進行

源代碼:

char * process_url(char * url,char * post){ 
    CURLcode res; 
    curl_easy_reset(curl); 
    if(curl){ 
     curl_easy_setopt(curl, CURLOPT_URL, url); 
     curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); 
     curl_easy_setopt(curl, CURLOPT_POSTREDIR,CURL_REDIR_POST_ALL); 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,1L); 
     curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1"); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,write_to_string); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 
     if (post) { 
      curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post); 
     } 
     ResponseStruct result; 
     result.response = malloc(sizeof(char)); 
     result.response[0] = '\0'; 
     result.length = 1; 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result); 
     res = curl_easy_perform(curl); //CRASHED HERE 
     if (res) { 
      printf("CURL FAILED WITH ERROR CODE %i\n",(int)res); 
      return NULL; 
     } 
     sec_sleep(1); //Prevent passing float limit. 
     return result.response; 
    } 
    return NULL; 
} 

這裏是功能堆棧:

#0 0x7fff869d22ae in _mdns_query_callback 
#1 0x7fff869bfc29 in handle_query_response 
#2 0x7fff869bf08b in DNSServiceProcessResult 
#3 0x7fff869d1a71 in _mdns_query_mDNSResponder 
#4 0x7fff869d0c61 in _mdns_search 
#5 0x7fff869cfffc in _mdns_addrinfo 
#6 0x7fff869cf059 in search_addrinfo 
#7 0x7fff869cea7a in si_addrinfo 
#8 0x7fff869ce48d in getaddrinfo 
#9 0x7fff831695fc in Curl_getaddrinfo_ex 
#10 0x7fff83164a3d in Curl_getaddrinfo 
#11 0x7fff8313dda3 in Curl_resolv 
#12 0x7fff8313dfb6 in Curl_resolv_timeout 
#13 0x7fff8314b225 in resolve_server 
#14 0x7fff83150aaf in create_conn 
#15 0x7fff83150c08 in Curl_connect 
#16 0x7fff8315b817 in Curl_perform 
#17 0x100001126 in process_url at main.c:90 
#18 0x1000013f7 in cancel_outstanding_order at main.c:158 
#19 0x100002aac in main at main.c:554 

程序中沒有使用線程。我在調試器中檢查了我的數據,這很好。 libcurl不喜歡某些東西。有沒有解決方案?

謝謝。

+0

最可能的問題是您傳入的URL存在問題。你如何生成它? –

+0

網址是https://api-test.tradehill.com/APIv1/USD/GetBalance –

回答

1

getaddrinfo()是您的操作系統(OS X)提供的libc調用。

至於lib​​curl中使用在許多操作系統完全相同的名稱解析功能,其中它不會崩潰,我會說,這表明該問題是真正的OS X,而不是libcurl中。

我從來沒有見過這個錯誤,雖然報道,這是奇怪的,如果它確實是在OS X中的錯誤,但後來我也從來沒看到過報道的libcurl。這可能意味着問題出在您的應用程序中...

如果您可以重複使用獨立示例程序的問題,然後將其提供給curl項目並讓他們(我們)幫助您調試這可能是一個想法。如果你不能用一個小程序重複它,這將是另一個表明問題是由你的應用程序造成的!

+0

好的,我會用一個小程序對它進行測試,看看錯誤是否發展。如果發生任何事情,我會盡快回復您。謝謝。 –