ulog组件中ulog_voutput(...)函数的bug反馈

发布于 2021-01-12 09:19:58

void ulog_voutput(rt_uint32_t level, const char tag, rt_bool_t newline, const char format, va_list args)
{

char *log_buf = NULL;
rt_size_t log_len = 0;

... ...

RT_ASSERT(tag);
RT_ASSERT(format);

if (!ulog.init_ok)
{
    return;
}

... ...

/* get log buffer 获取存储log使用buf地址 */
log_buf = get_log_buf();

/* lock output 上锁 */
output_lock();

/* 格式化处理 */
log_len = ulog_formater(log_buf, level, tag, newline, format, args);

... ...

/* do log output 输出log */
do_output(level, tag, RT_FALSE, log_buf, log_len);

/* 这里是我自己添加的代码;
 * 如果某个线程第一次输出的log较长,不在这里清零log_buf的话;有其它线程使用API进行log输出时,会发生问题;
 * 例如: LOG_I("Main Test Integer %d", cnt);
 *       LOG_I("ulog test application, hello world");
 * 打印结果如下:
 *          I/MAIN: Main Test Integer 1
            I/MAIN: ulog test application, hello world
            I/MAIN: Main Test Integer 2
            , hello world
            I/MAIN: ulog test application, hello world
            I/MAIN: Main Test Integer 3
            , hello world
            I/MAIN: ulog test application, hello world
 * 问题原因就出在"ulog_formater()"函数中,由于上次的log较长,也没有清理log_buf,vsnprintf函数返回计算长度的时候发生问题;
*/
rt_memset((void *)log_buf, '\0', log_len);

/* unlock output */
output_unlock();

}
追加:
当开启RT_USING_DEVICE宏进行测试,源码是没有问题的;不开启此宏测试有问题。

查看更多

关注者
0
被浏览
204
whj467467222
whj467467222 认证专家 2021-01-14

rt_memset虽然解决了问题,但是感觉效率不高。其实楼主只需要在RT_WEAK rt_size_t ulog_formater(char *log_buf, rt_uint32_t level, const char *tag, rt_bool_t newline,const char *format, va_list args)

这个函数 return 的上一句增加 log_buf[log_len] = 0; 即可。

5 个回答
iamyhw
iamyhw 2021-01-12

用*log_buf=0代替memset行吧。

Cfly
Cfly 认证专家 2021-01-13

需要在 console_be 里面把它的outpout中 rt_hw_console_output(log) 替换为 rt_kprintf("%.*s", len, log);

Jeed
Jeed 2021-01-13

可以直接在github提PR

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览