[java] FATAL SIGNAL 11 (Sigsegv) bei 0x00000000 (Code = 1)?



2 Answers

Wie von Nicola erwähnt, wird dies höchstwahrscheinlich durch Dereferenzierung eines Nullzeigers im nativen Code verursacht. Ich hatte ein ähnliches Problem und löste es durch Debugging des Stack-Trace.

Wenn Sie die Filterung in Ihrem Protokoll-Cat deaktivieren, wird der gesamte Stack-Trace angezeigt. Dadurch erhalten Sie detaillierte Informationen darüber, wo der Absturz aufgetreten ist. Ich habe das folgende Python-Skript verwendet, um die genaue Ursache zu finden. https://code.google.com/p/android-ndk-stacktrace-analyzer/wiki/Usage

In meinem Fall trat ein Null-Zeiger auf, weil ein benutzerdefinierter Android-Build ausgeführt wurde.

Viel Glück

Question

Warum tritt dieses Problem auf?

public static String path;
private VideoView mVideoView;


mVideoView = (VideoView) findViewById(R.id.surface_view);
mVideoView.setVideoPath(path);
mVideoView.setMediaController(new MediaController(this));
mVideoView.requestFocus();

//...

    private int mLayout = VideoView.VIDEO_LAYOUT_ZOOM;

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        if (mVideoView != null)
            mVideoView.setVideoLayout(mLayout, 0);
        super.onConfigurationChanged(newConfig);
    }




Ich hatte ein ähnliches Problem beim Beenden meiner Aktivität mit zwei TextureViews (zB Drücken der Home-Taste):

Fatal signal 11 (SIGSEGV), code 1, fault addr 0xa4680000 in tid 29013 (pool-4-thread-1)

Der Logcat zeigte, dass der Segv innerhalb einer drawXXX-Funktion auftauchte. Also habe ich versucht, nicht zu zeichnen, wenn die Oberfläche zerstört ist:

private synchronized void doDraw(Canvas canvas) {
...
}

doDraw () wird regelmäßig von einem Hintergrundthread aufgerufen. Um genau zu sein, verwenden Sie einen ScheduledExecutorService. Dieses Ding wird im zerstörten Listener gestoppt, der auch das synchronisierte Schlüsselwort hat:

public synchronized boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
    executorService.shutdownNow();
    return true;
}

Dies garantiert, dass die Oberfläche nur dann zerstört werden kann, wenn gerade nichts gezeichnet wird.

Kein Absturz mehr beim Verlassen der Aktivität!

Es scheint mir, dass niemand TextureViews verwendet, aber immer noch SurfaceViews. Leider hat letzteres einige Probleme beim Zeichnen von durchscheinenden Grafiken auf einigen Geräten, weshalb ich zu TextureView wechselte.

Hoffe das hilft.




Sie können ab dem letzten Garbage Collection-Aufruf sehen, dass der Garbage Collector keinen Speicher freigegeben hat und Ihnen kein Speicher zur Verfügung steht. Wie groß sind deine Puffer? Wie viel zusätzlichen Kopfraum benötigen sie?

Eine mögliche Lösung besteht darin, die Größe des größeren android:largeHeap="true" zu untersuchen, indem Sie android:largeHeap="true" , um eine große android:largeHeap="true" in Ihrem Anwendungsmanifest zuzulassen, die auf der Entwicklersite dokumentiert ist . .




Related