为什么打印log(比如printf)会经常碰到core dump?
来源:互联网 发布:宿州智慧云计算产业园 编辑:程序博客网 时间:2024/05/01 22:17
在实际开发中, 我们少不了打log, 如果参数类型和个数没有完全对应, 那就等着core dump吧(更可怕的是不得不解决的低概率core dump), 为什么呢? 我们以printf为例来看看源码:
int printf(const char *fmt, ...){ char buf[1024]; va_list args; int cnt; va_start(args, fmt); cnt = vsprintf(buf, fmt, args); va_end(args); putstr(buf); return cnt;}
继续看vsprintf,
int vsprintf(char *buf, const char *fmt, va_list args){ char *str, *s; int base; int flags = 0; int fildwidth = -1; int precision = -1; int qualifier; unsigned long num; for(str = buf; *fmt != '\0'; fmt++) { if(*fmt == '\t') { int k = 8; while(k--) *str++ = ' '; fmt++; } if(*fmt != '%') { *str++ = *fmt; continue; }handle_flags: fmt++; switch (*fmt) { case '#': flags |= PREFIX; goto handle_flags; } /* handle_fldwidth: */ /* don't need this now */ /* handle_precision: */ /* don't need this now */ /* handle_lenmodifier: */ /* don't need this now */ /* handle_qualifier: */ qualifier = -1; if(*fmt == 'l' || *fmt == 'L' || *fmt == 'h') { qualifier = *fmt; fmt++; } /* handle_convtype: */ base = 10; switch(*fmt) { case 'c': /* processing alignment */ *str = (unsigned char)va_arg(args, int); /* processing alignment */ continue; case 's': s = va_arg(args, char *); str = strcpy(str, s); /* is it safe? */ str--; continue; case 'd': break; case 'o': base = 8; break; case 'x': flags |= SMALL; case 'X': base = 16; break; default: *str++ = '%'; if(*fmt) *str++ = *fmt; else fmt--; continue; } if (qualifier == 'l') num = va_arg(args, unsigned long); else if (qualifier == 'h') num = (unsigned short)va_arg(args, int); else { num = va_arg(args, int); } str = num2str(str, num, base, fildwidth, precision, flags); } *str = '\0'; return str - buf;}可见, 参数个数、类型不匹配, 会导致内存赋值错误, core dump也就来啦。
OK, 先说这么多, 睡觉。
0 0
- 为什么打印log(比如printf)会经常碰到core dump?
- 又是打印log引发的core dump------类似printf("msg is %s", 1);
- 变长参数的三点..., 打印log为什么容易core dump?
- 经常会碰到 问题
- 又是打印log错误造成的core dump
- 为什么memset(szBuf, 0, sizeof(szBuf));会莫名其妙core dump?
- printf Log打印封装
- Android开发常见错误,经常会碰到
- LaTeX 中经常会碰到绘制表格.
- 面试会经常碰到的几个问题
- printf大坑等着很多人------一次core dump经历及定位过程(printf打印C++ string的时候忘了.c_st()转化)
- 一个低概率core dump问题的定位------打印log时访问了长度为0的vector
- 在QTP中,经常会遇到需要写入外部文件的地方,比如写Log什么的,这时,可以使用下面代码进行写Txt操作。
- JNI log来代替printf打印调试
- JNI log来代替printf打印调试
- JNI log来代替printf打印调试
- JNI log来代替printf打印调试
- JNI log来代替printf打印调试
- SCI论文及期刊查询
- 十年研发经验工程师的嵌入式学习书籍大推荐
- The patch E:\android-sdk-windows does not belong to a directory.Android studio will use this Andriod
- CF 41A Translation
- 入门TrafficServer插件开发的正确姿势
- 为什么打印log(比如printf)会经常碰到core dump?
- 从尾到头打印链表
- Android应用开发之(Gson的使用)
- 线程总结
- matlab 画图中线型及颜色设置
- 欢迎使用CSDN-markdown编辑器
- Swift 版本很好的卡片切换效果基于ZLSwipeableView(类似于[陌陌点点][探探])
- 用两个栈实现队列
- sql语句的执行顺序 以及 优化