我的C/C++语言学习进阶之旅NDK开发之解决错误:signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0xXXX
Posted 字节卷动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的C/C++语言学习进阶之旅NDK开发之解决错误:signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0xXXX相关的知识,希望对你有一定的参考价值。
一、错误描述
今天在使用C++实现一个OpenGL特效的时候,运行出错,如下所示:
错误描述为:
signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x75b23bef88
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: Build fingerprint: 'Xiaomi/cepheus/cepheus:11/RKQ1.200826.002/V12.5.6.0.RFACNXM:user/release-keys'
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: Revision: '0'
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: ABI: 'arm64'
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: Timestamp: 2022-06-10 11:08:22+0800
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: pid: 12319, tid: 12347, name: GLThread 6718 >>> com.oyp.face2dsticker <<<
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: uid: 10528
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x75b23bef88
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x0 0000000000000001 x1 0000000000000000 x2 0000000000000000 x3 0000000000000000
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x4 0000000000000000 x5 0000000000000050 x6 00000076b01e5000 x7 00000000005b018e
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x8 0000000000000000 x9 0000000000000000 x10 0000000000000001 x11 0000000000000001
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x12 0000000000000052 x13 0000000062a2b5a5 x14 003560faa22370df x15 000097e7543f071f
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x16 00000075b2414ca0 x17 00000075b23c00b4 x18 00000075b8b16000 x19 000000760b967400
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x20 0000000000000000 x21 000000760b967400 x22 00000075b8f23000 x23 000000760b9674b8
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x24 000000761fab0610 x25 00000075b8f23000 x26 000000000000000b x27 0000000000000000
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: x28 00000075b8f218f0 x29 00000075b8f21810
2022-06-10 11:08:22.005 12615-12615/? A/DEBUG: lr 00000075b23bef74 sp 00000075b8f21180 pc 00000075b23bef88 pst 0000000060000000
对应的堆栈信息前几行为:
022-06-10 11:08:22.170 12615-12615/? A/DEBUG: backtrace:
2022-06-10 11:08:22.170 12615-12615/? A/DEBUG: #00 pc 000000000002cf88 /data/app/~~2T5COK4_-x6o-a1NRWEMlg==/com.oyp.face2dsticker-g_kwM6JD6Gg0wDs828fp2g==/lib/arm64/libXtcOpenGLCross.so (FaceStickerFilterVLog::drawFrame(int, float*, float*)+3216) (BuildId: 84050149e3e5c3fb80b5f99fb981890951a97c16)
2022-06-10 11:08:22.170 12615-12615/? A/DEBUG: #01 pc 00000000000295cc /data/app/~~2T5COK4_-x6o-a1NRWEMlg==/com.oyp.face2dsticker-g_kwM6JD6Gg0wDs828fp2g==/lib/arm64/libXtcOpenGLCross.so (MyGLRenderContext::nativeOnDrawFrame(int)+284) (BuildId: 84050149e3e5c3fb80b5f99fb981890951a97c16)
2022-06-10 11:08:22.170 12615-12615/? A/DEBUG: #02 pc 000000000001de3c /data/app/~~2T5COK4_-x6o-a1NRWEMlg==/com.oyp.face2dsticker-g_kwM6JD6Gg0wDs828fp2g==/lib/arm64/libXtcOpenGLCross.so (Java_com_xtc_opengl_XtcCustomStickerRender_nativeOnDrawFrame+32) (BuildId: 84050149e3e5c3fb80b5f99fb981890951a97c16)
二、错误排查
2.1 addr2line排查堆栈
我使用我之前博客介绍的工具addr2line
,来确定是哪一行出错了
请输入当前目录下debug so的文件名:"D:\\GitLab Source\\Face2DSticker\\cross\\build\\intermediates\\cmake\\debug\\obj\\arm64-v8a\\libXtcOpenGLCross.so"
请输入异常时PC寄存器值:000000000002cf88
----------------------- addr2line ------------------------
debug文件路径: "D:\\GitLab Source\\Face2DSticker\\cross\\build\\intermediates\\cmake\\debug\\obj\\arm64-v8a\\libXtcOpenGLCross.so" PC=000000000002cf88
FaceStickerFilterVLog::drawFrame(int, float*, float*)
FaceStickerFilterVLog.cpp:?
---------------------------------------------------------
Press any key to continue . . .
但是值告诉了我是这个FaceStickerFilterVLog::drawFrame
函数出错,行号就没有显示了,直接一个?
号。
2.2 原始的log定位
然后我将这个函数体,从头到尾都加上了日志,想通过最原始的日志来排查问题。
发现从函数体最开始,到函数体最后面的所有日志全部打印了。
bool FaceStickerFilterVLog::drawFrame(int textureId, GLfloat *vertexBuffer, GLfloat *textureBuffer)
LOGD("FaceStickerFilterVLog::drawFrame start")
... 中间一堆代码
LOGD("FaceStickerFilterVLog::drawFrame end")
看来函数体中写的代码是没有问题的,但是运行还是一样的crash
2.3 把函数体变成空实现
然后我把函数体变成了空实现,啥都没有写,
bool FaceStickerFilterVLog::drawFrame(int textureId, GLfloat *vertexBuffer, GLfloat *textureBuffer)
函数体为空,但是运行还是一样的crash
2.4 认真查看代码
好吧,没办法,最终定位就是这个函数有问题,只能再认认真真看看这个函数到底哪里有问题。
我最终发现,这个FaceStickerFilterVLog::drawFrame
函数是定义了有bool
返回值的
bool FaceStickerFilterVLog::drawFrame(int textureId, GLfloat *vertexBuffer, GLfloat *textureBuffer);
但是我们的函数体内部并没有return
一个bool
值。
即使出现这样的没返回值错误,C++居然能编译过,但是最终会运行崩溃。
三、解决问题
解决办法就是,如果一个函数定义了有返回值
,那要保证各种case
下,都能有返回值
,即return XXX
语句一定要写。
最后,我在函数体结尾处加上了返回值,就正常运行了。
bool FaceStickerFilterVLog::drawFrame(int textureId, GLfloat *vertexBuffer, GLfloat *textureBuffer)
LOGD("FaceStickerFilterVLog::drawFrame start")
... 中间一堆代码
LOGD("FaceStickerFilterVLog::drawFrame end")
// 注意,这句话一定要写,一定要有返回值出去
return true;
重新运行代码,正常
四、总结
- 问题描述:出现
signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0xXXX
的问题时。 - 问题原因:是因为C++的函数缺少指定的返回值。遇到这个问题,要仔细排查一下整个调用链条上的方法是否缺少
return
语句 - 解决方法:添加上缺失的
return返回值
即可修复。
以上是关于我的C/C++语言学习进阶之旅NDK开发之解决错误:signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0xXXX的主要内容,如果未能解决你的问题,请参考以下文章
我的C/C++语言学习进阶之旅介绍一下NDK开发之C的简单易用图像库stb
我的C/C++语言学习进阶之旅介绍一下NDK开发之C的简单易用图像库stb
我的C/C++语言学习进阶之旅NDK开发之Native层使用fopen打开Android设备上的文件
我的C/C++语言学习进阶之旅NDK开发之Native层使用fopen打开Android设备上的文件
我的C/C++语言学习进阶之旅NDK开发运行的时候出现错误signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x940a2e48
我的C/C++语言学习进阶之旅NDK开发运行的时候出现错误signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x940a2e48