概率性出现 Segmentation fault 的情况之一

关键字:recv, malloc, gdb+core, fopen, sizeof, strlen

场景

在HI3518E的 RTSP 传输试验中,程序编译没有问题, 开发板上执行有时候会发生Segmentation fault,尤其是在 RTSP_CliMsg 线程的recv函数阻塞的情况下, 调度执行fopen函数时发生段错误。多次试验发现,当先执行 fopen 函数所在线程后执行 RTSP_CliMsg 线程时不发生段错误,而先执行 RTSP_CliMsg 线程后执行 fopen 所在线程时必然发生段错误。

尝试措施

gdb+core 调试 Segmentation fault

ulimit -c 1024 设置core文件大小
./a.out 执行应用程序
发生段错误,生成core文件
./gdb ./a.out core 执行gdb
输入bt, 列出调用栈
···
Thread 5 “sample_dk” received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb58c04d0 (LWP 2435)]
0xb6f3108c in malloc () from /lib/libc.so.0
(gdb) bt
#0 0xb6f3108c in malloc () from /lib/libc.so.0
#1 0xb6f0f140 in ?? () from /lib/libc.so.0
···
可以看出是malloc()返回了段错误, libc中的函数没有调试信息,无法定位调用 malloc 发生段错误的具体位置。很是麻烦。。。经过了很长很长时间的折腾后终于发现了问题所在

sizeof 和 strlen

Sizeof与Strlen的区别与联系
sizeof(xxx)是运算符,他的值是在编译时确定的,程序运行过程中不变
strlen(xxx)是函数, 他的值是在程序调用时确定的,程序执行过程中随着xxx变化

确定问题

而我在程序中用的是sizeof(指针),导致编译器只给了4个字节空间,在使用的时候发生越界,结果难以预料。故发生了概率性段错误。

解决问题

改用 strlen(指针) +1 就没问题了。

猜你喜欢

转载自blog.csdn.net/m0_50399735/article/details/111412188