2014-04-23 117 views
0
  • Node.js的0.10.26
  • OS X 10.9.2(也Ubuntu的流浪漢盒)

在我的系統上的兩個不同的模塊,當我運行使用摩卡測試,我得到這個錯誤:的getaddrinfo無法使用時,摩卡在hosts文件來解析地址

{ [Error: getaddrinfo ENOTFOUND] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo' }

這將通常意味着我試圖解決一個不存在的主機。我試圖發現使用DTrace這個腳本(即我發現稍微修改)問題:

#!/usr/sbin/dtrace -s 

#pragma D option quiet 

dtrace:::BEGIN 
{ 
    printf("%-20s %-12s %s\n", "TIME", "LATENCY(ms)", "HOST"); 
} 

pid$target::getaddrinfo:entry 
{ 
    self->host = copyinstr(arg0); 
    self->start = timestamp; 
} 

pid$target::getaddrinfo:return 
/self->start/ 
{ 
    printf("%d", arg1); 
    this->delta = (timestamp - self->start)/1000000; 
    printf("%-20Y %-12d %s\n", walltimestamp, this->delta, self->host); 
    self->host = 0; 
    self->start = 0; 
} 

使用這個我可以看到,每一個被通過我的測試中命中的主機或者是在我的主機文件或者是我的主機名。 printf("%d", arg1);打印出(I think)函數的返回值。不幸的是,我看到的返回值是一些大數字,而不是0-1like it should be

因此,有可能出錯了我的DTrace腳本,但是這並不能說明我更大的問題:

爲什麼主機data-proxy沒有當我的hosts文件包含127.0.0.1 data-proxy解決?爲什麼這隻發生在我正在運行摩卡測試時,而不是當我運行我的服務並手動點擊它們時?

如果您想查看獲取錯誤的相關node.js代碼,請隨時查看mongodb和請求,因爲我的用法看起來像他們的示例。

+0

它看起來可能是因爲忘記關閉某個文件句柄。 檢查出:https://github.com/mikeal/request/issues/699 – Daniel

回答

0

嘗試投ARG1INT

printf("%d\n", (int) arg1); 

這是我最近發現了一個問題,這也許可以解釋爲什麼你會變得非常大的數字。 IIRC,這是因爲在內核arg0arg12存儲在一個uint64_t。我不記得libdtrace中的代碼路徑來實際執行轉換。

+0

我試過,但我仍然得到奇怪的結果。這些參數的值似乎取決於我打印出的數量:arg0 arg1 arg2給出的值不同於arg0 arg1。你知道我可以閱讀的東西來了解更多關於這個嗎? – joshuten

+0

這是我正在嘗試的[gist](https://gist.github.com/joshkuten/11291880) – joshuten

0

arg1的大數歸結於DTrace's Tail-call Optimization。 如果可能,您可以檢查getaddrinfo源代碼(如果沒有,請使用gdb工具的disassemble命令),並且您會發現getaddrinfo可能會調用其他函數。

相關問題