某服务在跑的时候, 从来没有core dump过, 某次, core dump了。 老大收到core dump告警后, 在群里贴了一下, 我开始着手定位。 这是个低概率的core dump, 重现原来问题几乎没有可能。
那就去看core吧, gdb xxx core一下发现, 程序core在一个字符串处理的地方, 但是, 无法进一步知道更具体的原因。 为了简便起见, 我对原来的函数进行变形和简化:
// linux 环境哦 !!!
#include <iostream>
#include <string>
using namespace std;
void fun(const string &s)
{
char buf[s.size() + 1];
string str;
}
int main()
{
int len = 100;
string s(len, 'a');
fun(s);
return 0;
}
确实看不出什么问题, 于是, 我自己构造场景来产生core, 发现, 比如当len = 10000000时候, 程序必然core(len的长度一般不可能这么长, 只有极端情况下才会有这么长), core的原因是栈溢出, 用gdb分析一下就知道, 出现了out of bound。 于是, 就定位到问题了, 定到问题后, 处理起来就很简单了。
不多说。