今天在调试多进程时,发现有一个进程崩溃了,打印堆栈如:
在调用本地接口reportHashSTL后,进到c库接口__stack_chk_fail,上网搜索了一下,这个错误表示栈溢出,一般是数组越界写入导致,__stack_chk_fail相关的可自行网上搜索。这里记录排查过程。
1,首先是找到调用源码,如下:
注意这里数组大小为84。
2,reportHash 源码片段,如下:
一开始以为是for循环里循环次数太大导致入参report不够装下,但第一次加打印时 mInternal->mBlockSize = 32,这样看入参大小也是够的。没办法在for循环里加了字符串长度打印,打印结果一目了然,如下:
再一仔细看代码,上面红框圈起的部分,第一个“ %02X”是3个字符,因为多加了一个空格,这不仔细读代码的话不容易发现啊。到这里不难看出report已经被塞了95个字符了,但它传进来的只有84个字符空间大小,不崩才怪呢!!解决办法是加大tszOut数组大小,改成tszOut[128],问题解决。