我的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