Android RenderScript 信号 7 (SIGBUS),代码 1 (BUS_ADRALN),故障地址 0x76f458b4 Adreno 306、320
Android RenderScript signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x76f458b4 Adreno 306, 320
我在两个测试设备上遇到问题 - 三星 Galaxy J5,Android 6.0.1,内核 3.10.49-11903637,构建 MMB29M.J510FNXXU2AQG3 GPU Adreno 306 和 Nexus 4 -GPU Adreno 320 .
我试图通过对位图进行两次过滤来计算位图的清晰度。使用原始位图的采样大小,大小小于 64x64,以提高性能。
相同的代码在三星 Galaxy S6、索尼 Xperia Z3、三星 Galaxy Tab 10.1 (2016)、华为 P10 上运行良好。
试过改输入参数,用不同的图片,不同的系数,但是在J5上总是闪退
更新:
对于其他设备拍摄的照片,旋转为纵向(高度大于宽度)时成功通过。
但是在同一台设备上拍摄的照片,无论我如何旋转它们都会崩溃。
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(imagePath, options)
val imageSize = SizeT(options.outWidth, options.outHeight)
val imageScale = imageSize.scaleToFitInSize( SizeT( 64, 64) )
val imageScaledSize = imageSize.scale(imageScale.toDouble())
options.inJustDecodeBounds = false
options.inSampleSize = ImageUtils.calculateInSampleSize(imageSize, imageScaledSize, 1.0)
val sourceBitmap = BitmapFactory.decodeFile(imagePath, options)
var sobelScript: ScriptC_sobel? = null
var inputAllocation: Allocation? = null
var outputAllocation: Allocation? = null
var intermediateAllocation: Allocation? = null
var convolve3x3: ScriptIntrinsicConvolve3x3? = null
var renderScript: RenderScript? = null
val imageWidth = sourceBitmap.width
val imageHeight = sourceBitmap.height
renderScript = RenderScript.create(ApplicationContext.ApplicationContext())
inputAllocation = Allocation.createFromBitmap(renderScript, sourceBitmap)
val typeInBuilder = Type.Builder(renderScript, Element.F32_4(renderScript)).setX( imageWidth ).setY( imageHeight )
// Allocation where to store the sum result (for output purposes)
val coefficientsGx = floatArrayOf(-1f, 0f, 1f, -2f, 0f, 2f, -1f, 0f, 1f)
val coefficientsGy = floatArrayOf(-1f, -2f, -1f, 0f, 0f, 0f, 1f, 2f, 1f)
intermediateAllocation = Allocation.createTyped(renderScript, typeInBuilder.create())
convolve3x3 = ScriptIntrinsicConvolve3x3.create(renderScript, Element.F32_4(renderScript))
convolve3x3.setInput(inputAllocation)
convolve3x3.setCoefficients(coefficientsGx)
convolve3x3.forEach(intermediateAllocation)
在最后一行,程序因本机错误而崩溃:
? D/NetworkController.MobileSignalController(0/2147483643): onSignalStrengthsChanged signalStrength=SignalStrength: 26 99 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 -1 2147483647 0x4 gsm|lte level=4
2302-2671/? D/NetworkController.MobileSignalController(0/2147483643): getMobileIconGroup(): 0
16440-17400/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f458b4 in tid 17400 (AsyncTask #4)
16440-17398/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f456d4 in tid 17398 (AsyncTask #4)
16440-17398/ I/libc: Another thread contacted debuggerd first; not contacting debuggerd.
16440-17399/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f45404 in tid 17399 (AsyncTask #4)
16440-17399/ I/libc: Another thread contacted debuggerd first; not contacting debuggerd.
16440-17396/ A/libc: Fatal signal 7 (SIGBUS) in tid 17396 (AsyncTask #4)
16440-17396/I/libc: Another thread contacted debuggerd first; not contacting debuggerd.
400-400/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
400-400/? A/DEBUG: Build fingerprint: 'samsung/j5xnltexx/j5xnlte:6.0.1/MMB29M/J510FNXXU2AQG3:user/release-keys'
400-400/? A/DEBUG: Revision: '4'
400-400/? A/DEBUG: ABI: 'arm'
400-400/? A/DEBUG: pid: 16440, tid: 17400, name: AsyncTask #4 >>> com.test.development <<<
400-400/? A/DEBUG: signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x76f458b4
400-400/? A/DEBUG: r0 0000003b r1 00000000 r2 b8ceb4a0 r3 76f458b4
400-400/? A/DEBUG: r4 76f458b4 r5 9b68a7f8 r6 b8ceb4a0 r7 00000000
400-400/? A/DEBUG: r8 0000003c r9 76f459a4 sl 76f458b4 fp 76f45a94
400-400/? A/DEBUG: ip b8cb3c14 sp 9b68a7b0 lr 00000001 pc 9cff66d8 cpsr 200f0030
400-400/? A/DEBUG: backtrace:
400-400/? A/DEBUG: #00 pc 0002d6d8 /system/lib/libRSCpuRef.so
400-400/? A/DEBUG: #01 pc 0002d68b /system/lib/libRSCpuRef.so (_ZN7android12renderscript32RsdCpuScriptIntrinsicConvolve3x38kernelF4EPK24RsExpandKernelDriverInfojjj+122)
400-400/? A/DEBUG: #02 pc 0001f1f5 /system/lib/libRSCpuRef.so
400-400/? A/DEBUG: #03 pc 0001eb67 /system/lib/libRSCpuRef.so (_ZN7android12renderscript19RsdCpuReferenceImpl16helperThreadProcEPv+138)
400-400/? A/DEBUG: #04 pc 00041813 /system/lib/libc.so (_ZL15__pthread_startPv+30)
400-400/? A/DEBUG: #05 pc 00019315 /system/lib/libc.so (__start_thread+6)
com.test.development A/libc: Fatal signal 7 (SIGBUS) in tid 3368 (AsyncTask #4)
? E/audit: type=1701 msg=audit(1509449660.557:282): auid=4294967295 uid=10133 gid=10133 ses=4294967295 subj=u:r:untrusted_app:s0:c512,c768 pid=3371 comm=4173796E635461736B202334 reason="memory violation" sig=7
所以通过将 Script.LaunchOptions 传递给 convolve3x3.forEach 函数解决了问题,限制了内核将运行的交集。将其设置在分配范围内就可以了。
renderScript = RenderScript.create(ApplicationContext.ApplicationContext())
inputAllocation = Allocation.createFromBitmap(renderScript, sourceBitmap)
val typeInBuilder = Type.Builder(renderScript, Element.F32_4(renderScript)).setX( imageWidth ).setY( imageHeight )
val launchOptions = Script.LaunchOptions()
launchOptions.setX( 0, imageWidth-1 )
launchOptions.setY( 0, imageHeight-1)
launchOptions.setZ( 0, 1 )
// Allocation where to store the sum result (for output purposes)
val coefficientsGx = floatArrayOf(-1f, 0f, 1f, -2f, 0f, 2f, -1f, 0f, 1f)
val coefficientsGy = floatArrayOf(-1f, -2f, -1f, 0f, 0f, 0f, 1f, 2f, 1f)
intermediateAllocation = Allocation.createTyped(renderScript, typeInBuilder.create())
convolve3x3 = ScriptIntrinsicConvolve3x3.create(renderScript, Element.F32_4(renderScript))
convolve3x3.setInput(inputAllocation)
convolve3x3.setCoefficients(coefficientsGx)
convolve3x3.forEach(intermediateAllocation, launchOptions)
我在两个测试设备上遇到问题 - 三星 Galaxy J5,Android 6.0.1,内核 3.10.49-11903637,构建 MMB29M.J510FNXXU2AQG3 GPU Adreno 306 和 Nexus 4 -GPU Adreno 320 . 我试图通过对位图进行两次过滤来计算位图的清晰度。使用原始位图的采样大小,大小小于 64x64,以提高性能。 相同的代码在三星 Galaxy S6、索尼 Xperia Z3、三星 Galaxy Tab 10.1 (2016)、华为 P10 上运行良好。 试过改输入参数,用不同的图片,不同的系数,但是在J5上总是闪退
更新: 对于其他设备拍摄的照片,旋转为纵向(高度大于宽度)时成功通过。 但是在同一台设备上拍摄的照片,无论我如何旋转它们都会崩溃。
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(imagePath, options)
val imageSize = SizeT(options.outWidth, options.outHeight)
val imageScale = imageSize.scaleToFitInSize( SizeT( 64, 64) )
val imageScaledSize = imageSize.scale(imageScale.toDouble())
options.inJustDecodeBounds = false
options.inSampleSize = ImageUtils.calculateInSampleSize(imageSize, imageScaledSize, 1.0)
val sourceBitmap = BitmapFactory.decodeFile(imagePath, options)
var sobelScript: ScriptC_sobel? = null
var inputAllocation: Allocation? = null
var outputAllocation: Allocation? = null
var intermediateAllocation: Allocation? = null
var convolve3x3: ScriptIntrinsicConvolve3x3? = null
var renderScript: RenderScript? = null
val imageWidth = sourceBitmap.width
val imageHeight = sourceBitmap.height
renderScript = RenderScript.create(ApplicationContext.ApplicationContext())
inputAllocation = Allocation.createFromBitmap(renderScript, sourceBitmap)
val typeInBuilder = Type.Builder(renderScript, Element.F32_4(renderScript)).setX( imageWidth ).setY( imageHeight )
// Allocation where to store the sum result (for output purposes)
val coefficientsGx = floatArrayOf(-1f, 0f, 1f, -2f, 0f, 2f, -1f, 0f, 1f)
val coefficientsGy = floatArrayOf(-1f, -2f, -1f, 0f, 0f, 0f, 1f, 2f, 1f)
intermediateAllocation = Allocation.createTyped(renderScript, typeInBuilder.create())
convolve3x3 = ScriptIntrinsicConvolve3x3.create(renderScript, Element.F32_4(renderScript))
convolve3x3.setInput(inputAllocation)
convolve3x3.setCoefficients(coefficientsGx)
convolve3x3.forEach(intermediateAllocation)
在最后一行,程序因本机错误而崩溃:
? D/NetworkController.MobileSignalController(0/2147483643): onSignalStrengthsChanged signalStrength=SignalStrength: 26 99 -120 -160 -120 -1 -1 99 2147483647 2147483647 2147483647 -1 2147483647 0x4 gsm|lte level=4
2302-2671/? D/NetworkController.MobileSignalController(0/2147483643): getMobileIconGroup(): 0
16440-17400/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f458b4 in tid 17400 (AsyncTask #4)
16440-17398/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f456d4 in tid 17398 (AsyncTask #4)
16440-17398/ I/libc: Another thread contacted debuggerd first; not contacting debuggerd.
16440-17399/ A/libc: Fatal signal 7 (SIGBUS), code 1, fault addr 0x76f45404 in tid 17399 (AsyncTask #4)
16440-17399/ I/libc: Another thread contacted debuggerd first; not contacting debuggerd.
16440-17396/ A/libc: Fatal signal 7 (SIGBUS) in tid 17396 (AsyncTask #4)
16440-17396/I/libc: Another thread contacted debuggerd first; not contacting debuggerd.
400-400/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
400-400/? A/DEBUG: Build fingerprint: 'samsung/j5xnltexx/j5xnlte:6.0.1/MMB29M/J510FNXXU2AQG3:user/release-keys'
400-400/? A/DEBUG: Revision: '4'
400-400/? A/DEBUG: ABI: 'arm'
400-400/? A/DEBUG: pid: 16440, tid: 17400, name: AsyncTask #4 >>> com.test.development <<<
400-400/? A/DEBUG: signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x76f458b4
400-400/? A/DEBUG: r0 0000003b r1 00000000 r2 b8ceb4a0 r3 76f458b4
400-400/? A/DEBUG: r4 76f458b4 r5 9b68a7f8 r6 b8ceb4a0 r7 00000000
400-400/? A/DEBUG: r8 0000003c r9 76f459a4 sl 76f458b4 fp 76f45a94
400-400/? A/DEBUG: ip b8cb3c14 sp 9b68a7b0 lr 00000001 pc 9cff66d8 cpsr 200f0030
400-400/? A/DEBUG: backtrace:
400-400/? A/DEBUG: #00 pc 0002d6d8 /system/lib/libRSCpuRef.so
400-400/? A/DEBUG: #01 pc 0002d68b /system/lib/libRSCpuRef.so (_ZN7android12renderscript32RsdCpuScriptIntrinsicConvolve3x38kernelF4EPK24RsExpandKernelDriverInfojjj+122)
400-400/? A/DEBUG: #02 pc 0001f1f5 /system/lib/libRSCpuRef.so
400-400/? A/DEBUG: #03 pc 0001eb67 /system/lib/libRSCpuRef.so (_ZN7android12renderscript19RsdCpuReferenceImpl16helperThreadProcEPv+138)
400-400/? A/DEBUG: #04 pc 00041813 /system/lib/libc.so (_ZL15__pthread_startPv+30)
400-400/? A/DEBUG: #05 pc 00019315 /system/lib/libc.so (__start_thread+6)
com.test.development A/libc: Fatal signal 7 (SIGBUS) in tid 3368 (AsyncTask #4)
? E/audit: type=1701 msg=audit(1509449660.557:282): auid=4294967295 uid=10133 gid=10133 ses=4294967295 subj=u:r:untrusted_app:s0:c512,c768 pid=3371 comm=4173796E635461736B202334 reason="memory violation" sig=7
所以通过将 Script.LaunchOptions 传递给 convolve3x3.forEach 函数解决了问题,限制了内核将运行的交集。将其设置在分配范围内就可以了。
renderScript = RenderScript.create(ApplicationContext.ApplicationContext())
inputAllocation = Allocation.createFromBitmap(renderScript, sourceBitmap)
val typeInBuilder = Type.Builder(renderScript, Element.F32_4(renderScript)).setX( imageWidth ).setY( imageHeight )
val launchOptions = Script.LaunchOptions()
launchOptions.setX( 0, imageWidth-1 )
launchOptions.setY( 0, imageHeight-1)
launchOptions.setZ( 0, 1 )
// Allocation where to store the sum result (for output purposes)
val coefficientsGx = floatArrayOf(-1f, 0f, 1f, -2f, 0f, 2f, -1f, 0f, 1f)
val coefficientsGy = floatArrayOf(-1f, -2f, -1f, 0f, 0f, 0f, 1f, 2f, 1f)
intermediateAllocation = Allocation.createTyped(renderScript, typeInBuilder.create())
convolve3x3 = ScriptIntrinsicConvolve3x3.create(renderScript, Element.F32_4(renderScript))
convolve3x3.setInput(inputAllocation)
convolve3x3.setCoefficients(coefficientsGx)
convolve3x3.forEach(intermediateAllocation, launchOptions)