2014-01-28 20 views
0

任務是從一個跟蹤器讀取數據包並寫入許多數據包。銷燬libtrace_out_t數組的問題*

我使用libtrace_out_t **作爲輸出跟蹤器。
初始化:

uint16_t size = 10; 
libtrace_out_t** array = libtrace_out_t*[size]; 
for(uint16_t i = 0; i < size; ++i) { 
    array[i] = trace_create_output(uri); // created OK 
    trace_start_output(outTracers_[i]); // started OK 
} 

// writing packets 

創建,啓動和使用示蹤劑的數組中的元素寫入數據包的罰款。

for(uint16_t i = 0; i < size; ++i) 
{ 
    if(outTracers_[i]) 
    trace_destroy_output(outTracers_[i]); 
} 

在第一次迭代輸出示蹤劑破壞細:
的問題通過trace_destroy_output()當我破壞迴路輸出示蹤劑引起的。
但在第二個失敗與分割故障

pcap_close(pcap_t* p) 

因爲指針p具有價值爲0x0。

有人可以解釋我爲什麼會發生這種事情或如何正確地銷燬它?

+0

你可以顯示代碼分配給outTracers_或libtrace_out_t **的內存嗎?問題可能不是我在你顯示的代碼 – Pandrei

回答

0

在一個有效的元素從您發佈的代碼,看起來您正在使用相同的URI創建10個輸出跟蹤。所以,基本上,你已經創建了10個輸出文件,全部使用相同的文件名,這可能不是你想要的。

當需要銷燬輸出軌跡時,第一個銷燬關閉與您提供的名稱匹配的文件,並將該文件的引用設置爲NULL。由於引用現在爲NULL,因此任何後續嘗試銷燬該文件都將導致分段錯誤。

確保您更改了您創建的每個新輸出跟蹤的URI,並且您應該修復該問題。

實施例:

/* I prefer pcapfile: over pcap: */ 
const char *base="pcapfile:output"; 
uint16_t size = 10; 
libtrace_out_t* array[size]; 
for (uint16_t i = 0; i < size; ++i) { 
    char myuri[1024]; 
    /* First output file will be called output-1.pcap 
    * Second output file will be called output-2.pcap 
    * And so on... 
    */ 
    snprintf(myuri, 1023, "%s-%u.pcap", base, i); 
    array[i] = trace_create_output(uri); 
    /* TODO Check for errors here */ 
    if (trace_start_output(array[i])) { 
     /* TODO Handle error case */ 
    } 
} 

其他一個提示:libtrace已經包括工具稱爲tracesplit這需要輸入源並且將所述分組分成基於某些標準(數據包的例如數,輸出的大小多輸出跡線文件,時間間隔)。這個工具可能已經做了你想要的,而不必編寫代碼,或者至少它會在編寫你自己的代碼時充當一個很好的例子。

+0

其實每個跟蹤器都有不同的URI。 但是,當我將URI的基礎從「pcap:」更改爲「pcapfile:」時,問題得到了解決。之後,所有示蹤劑成功銷燬。 謝謝! – ShaaaMan

0

我認爲你有一個出界訪問在你的代碼

uint16_t size = 5; /// number of tracers 
for(uint16_t i = 0; i != size; ++i) 
{ 
    if(outTracers_[i]) 
    trace_destroy_output(outTracers_[i]); 
} 

轉化爲

for(uint16_t i = 0; i <= 5; ++i) 
{ 
    ... 
} 

而且outTracers_ [5]是不是你的陣列

+0

謝謝,但Seg。第二次迭代出現故障。 我認爲,這是不同的。 – ShaaaMan

+0

那麼它可能是你沒有正確初始化你的對象... – Pandrei