变长参数的三点..., 打印log为什么容易core dump?
2017-11-03 18:30
405 查看
看变长参数, 很简单:
#include <iostream>
#include <stdarg.h>
using namespace std;
int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);
cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, int) << endl;
va_end(ptr);
return 0;
}
int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
结果:
1
log
3
稍作改动:
#include <iostream>
#include <stdarg.h>
using namespace std;
int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);
cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, char *) << endl; // change here
va_end(ptr);
return 0;
}
int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
程序coredump, 很显然, 参数类型不对。
有兴趣的同学, 看看printf函数的源码, 也用到了变长参数, 所以, 当类型不匹配的时候, 经常会core dump, 呵呵哒。
项目实战中, 几乎所有人的人都会遇到打印log而导致的core dump问题, 最典型的就是:
string str;
printf("hehe is %s", str);
core dump, so fix it.
#include <iostream>
#include <stdarg.h>
using namespace std;
int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);
cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, int) << endl;
va_end(ptr);
return 0;
}
int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
结果:
1
log
3
稍作改动:
#include <iostream>
#include <stdarg.h>
using namespace std;
int fun(const char *p, ...)
{
va_list ptr;
va_start(ptr, p);
cout << va_arg(ptr, int) << endl;
cout << va_arg(ptr, char *) << endl;
cout << va_arg(ptr, char *) << endl; // change here
va_end(ptr);
return 0;
}
int main()
{
fun("%s%d%s%s%d", 1, "log", 3);
return 0;
}
程序coredump, 很显然, 参数类型不对。
有兴趣的同学, 看看printf函数的源码, 也用到了变长参数, 所以, 当类型不匹配的时候, 经常会core dump, 呵呵哒。
项目实战中, 几乎所有人的人都会遇到打印log而导致的core dump问题, 最典型的就是:
string str;
printf("hehe is %s", str);
core dump, so fix it.
相关文章推荐
- 为什么打印log(比如printf)会经常碰到core dump?
- 又是打印log错误造成的core dump
- 可变参数实现log打印
- 又是打印log引发的core dump------类似printf("msg is %s", 1);
- vsnprintf打印可变参数的log
- tomcat的acess_log打印post请求参数,分析日志
- fread的第二个参数和第三个参数可以互换吗---为什么fread容易返回0 ?
- Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统
- __android_log_vprint可变参数打印日志
- 一个低概率core dump问题的定位------打印log时访问了长度为0的vector
- 做dataguard犯了一个低级错误修改参数报错ORA-16187: LOG_ARCHIVE_CONFIG contains duplicate, conflicting or invalid att
- 闲谈程序中如何打印log
- 关于Xcode8打印一堆log问题
- NDK开发中JNI打印log信息
- Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数
- [MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数
- [log]logstash重要参数
- Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?
- 使用Log4j时,为什么要写if (log.isDebugEnabled()) 或 if (log.isInfoEnabled())
- JVM实用参数(三)打印所有XX参数及值