2013-04-25 38 views
1

我正在實現內存調試日誌機制。的要求如下用於調試日誌記錄的循環緩衝區

  • 的緩衝器,用於存儲調試消息是固定的,可以說,4KB
  • 寫入緩衝區的調試消息在尺寸上任意的可以是10個字節或2000個字節或更多
  • 的一旦緩衝區已滿,應該旋轉調試消息。
  • 調試消息必須按照插入緩衝區的順序檢索。

我正在考慮將這個作爲一個單一的鏈接列表與一個muncher來收集緩衝區,當所有的緩衝區被利用。

你們認爲什麼?任何指針和建議將非常感激。

0_l_0

+1

那是4K的指針或4K的所有文字? – 2013-04-25 23:06:48

+0

你不需要鏈接列表。該列表會浪費太多內存,特別是如果你有一堆簡短的調試消息。您只需要一個指針來跟蹤起始點,另一個指針用於跟蹤4K循環緩衝區的末端。 – TJD 2013-04-25 23:21:04

+1

然後用長度前綴(如果我理解了你想要的佈局)或者單字節(又名'0xFF')記錄每個消息的前2個字節並記錄消息結束。假設你想辨別出另一條消息,如果這只是一大塊旋轉文本,則不需要它。 – WhozCraig 2013-04-25 23:24:19

回答

2

感謝名單大家的答覆。這是我已經完成的實施。

  • 插入到環每個消息將與該消息長度的前綴
  • 將有頭和尾指針,和ring_size。
  • 對於每一個消息被寫入到環形緩衝區,我會進行以下檢查

    • 是否有新消息環形緩衝區空間?
    • 該消息是否需要移動頭部以便爲要插入的新消息騰出空間,如果是,請移動頭部以填充最舊的消息,直到我們有足夠的空間容納新消息。現在插入消息並更新尾部。
    • 我必須考慮的另一件事是在從/向緩衝區讀取/寫入消息時環繞。例如,當要插入的新消息超過環形邊界時,這是一種特殊的寫入操作,當我們到達緩衝區結束時,會進行環繞。從本質上講,消息的讀/寫操作會導致兩次讀/寫操作。一次寫入/讀取直到響鈴結束,再從緩衝區開始讀取/寫入一次。
  • 由於頭指向最舊的消息,並且我可以通過消息的前綴長度遍歷環,因此排序不成問題。

零壹 0_l_0

+0

我正在處理類似的問題/代碼,在上面的回顧中,您是在將日誌寫入臨時位置然後獲取大小的情況下處理它,或者,當您獲取日誌時,您已經知道大小? (這種簡化問題)。我使用'vsprintf',我知道尺寸的唯一方法是打印一次,然後檢查尺寸! – vyom 2013-09-26 12:25:19

+0

我知道函數收到日誌消息的大小。我同意,這簡化了邏輯。 – 2013-10-02 01:51:03