简体   繁体   中英

Android RenderScript signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x76f458b4 Adreno 306, 320

I'm having problem on two test devices- Samsung Galaxy J5 ,Android 6.0.1, Kernel 3.10.49-11903637, Build MMB29M.J510FNXXU2AQG3 GPU Adreno 306, and Nexus 4 -GPU Adreno 320. I am trying to calculate the sharpness of the bitmap, by making two filtrations on bitmap. Sampled size of original bitmap is used, with size less than 64x64, for performance. Same code works just fine on Samsung Galaxy S6, Sony Xperia Z3, Samsung Galaxy Tab 10.1 (2016), Huawei P10. Tried changing input parameters, used different images, different coefficients, but on J5 it always crashes.

Update: For photos taken on other devices, pass successfully when are rotated to portrait,( height bigger than width). However photos taken on same device, crash no mater how i rotate them.

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)

On this last line, program crashes with native error:

? 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

So the problem got solved by passing Script.LaunchOptions to convolve3x3.forEach function, limiting intersection over which kernel will operate. Setting it within the range of the allocation did the job.

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM