2013-04-25 89 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