Fatal Signal 6 Código SIGABRT = -6

? bece @ | Original: StackOverFlow
---

Eu estou escrevendo um programa android para visualizar o sinal de áudio . A principal atividade é :

package com.example.soundvisualizer;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
private CDrawer.CDrawThread mDrawThread;
private CDrawer mdrawer;
private Button btn;
private View.OnClickListener listener;
private Boolean m_bStart;
private Boolean recording;
private CSampler sampler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    m_bStart = false;
    mdrawer = (CDrawer) findViewById(R.id.drawer);
    while (true){
        recording = false;
        run();    
        return; 
    }  
}

/**
 * Pause the visualizer when the app is paused
 */
@Override
protected void onPause(){
    System.out.println("onPause");
    sampler.SetRun(false);
    mDrawThread.setRun(false);
    sampler.SetSleeping(true);
    mDrawThread.SetSleeping(true);
    super.onPause();
}
/**
 * Resters the visualizer when the app restarts
 */
@Override
protected void onRestart(){
    m_bStart = true;
    System.out.println("onRestart");
    super.onRestart();
}
/**
 * Resume the visualizer when the app resumes
 */
@Override
protected void onResume(){
    System.out.println("onResume");
    int i = 0;
    while (true){
        if ((sampler.GetDead2()) && (mdrawer.GetDead2())){
            System.out.println(sampler.GetDead2() + ", " + mdrawer.GetDead2());
            sampler.Restart();
            if (!m_bStart.booleanValue())
                mdrawer.Restart(true);
            sampler.SetSleeping(false);
            mDrawThread.SetSleeping(false);
            m_bStart = false;
            super.onResume();
            return;
        }
        try{
            Thread.sleep(500L);
            System.out.println("Hang on..");
            i++;
            if (!sampler.GetDead2().booleanValue())
                System.out.println("sampler not DEAD!!!");
            if (!mdrawer.GetDead2().booleanValue()){
                System.out.println("mDrawer not DeAD!!");
                mdrawer.SetRun(false);
            }
            if (i <= 4)
                continue;
            mDrawThread.SetDead2(true);
        }
        catch (InterruptedException localInterruptedException){
            localInterruptedException.printStackTrace();
        }
    }   
}

@Override
protected void onStart(){
    System.out.println("onStart");
    super.onStart();
}

@Override
protected void onStop(){
    System.out.println("onStop");
    super.onStop();
}


/** 
 * Recives the buffert from the sampler
 * @param buffert
 */
public void setBuffer(short[] paramArrayOfShort){
    mDrawThread = mdrawer.getThread();
    mDrawThread.setBuffer(paramArrayOfShort);
}

/**
 * Called by OnCreate to get everything up and running
 */
public void run(){
    try {
        if (mDrawThread == null){
            mDrawThread = mdrawer.getThread();
        }
        if (sampler == null)
            sampler = new CSampler(this);
        Context localContext = getApplicationContext();
        Display localDisplay = getWindowManager().getDefaultDisplay();
        Toast localToast = Toast.makeText(localContext, "Please make some noise..", Toast.LENGTH_LONG);
        localToast.show();
        if (sampler != null){
            try {
                sampler.Init();
            } 
            catch (Exception e) {
                Toast.makeText(this,"Could not instance the sampler. Could not access the device audio-drivers", Toast.LENGTH_LONG).show();
            }
            btn = (Button) this.findViewById(R.id.button_stop);
            btn.setOnClickListener(this);
            sampler.StartRecording();
            sampler.StartSampling();
        }
      }
    catch (NullPointerException e) {
        Log.e("Main_Run", "NullPointer: " + e.getMessage());
    }
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(btn.getText().equals("Start")){
        btn.setText("Stop");
        sampler.StartRecording();
        sampler.StartSampling();
    }
    else{
        btn.setText("Start");
        sampler.StopRecording();
    }
}

}

Agora, o aplicativo é iniciado e funciona muito bem. i clique no botão de parada e é ok. clique novamente e iniciar o reinício funciona bem. quando eu clique em Parar novamente o aplicativo falha eo logcat exibe as seguintes linhas reguarding meu app:

I/ActivityManager(  755): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.soundvisualizer/.MainActivity} from pid 1054
I/ActivityManager(  755): Start proc com.example.soundvisualizer for activity com.example.soundvisualizer/.MainActivity: pid=6959 uid=10126 gids={50126}
I/ActivityManager(  755): Displayed com.example.soundvisualizer/.MainActivity: +710ms
W/ActivityManager(  755):   Force finishing activity com.example.soundvisualizer/.MainActivity
W/ActivityManager(  755): Exception thrown during pause
W/ActivityManager(  755): android.os.DeadObjectException
W/ActivityManager(  755):   at android.os.BinderProxy.transact(Native Method)
W/ActivityManager(  755):   at android.app.ApplicationThreadProxy.schedulePauseActivity(ApplicationThreadNative.java:660)
W/ActivityManager(  755):   at com.android.server.am.ActivityStack.startPausingLocked(ActivityStack.java:761)
W/ActivityManager(  755):   at com.android.server.am.ActivityStack.finishActivityLocked(ActivityStack.java:2455)
W/ActivityManager(  755):   at com.android.server.am.ActivityStack.finishTopRunningActivityLocked(ActivityStack.java:2329)
W/ActivityManager(  755):   at com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked(ActivityStackSupervisor.java:2035)
W/ActivityManager(  755):   at com.android.server.am.ActivityManagerService.handleAppCrashLocked(ActivityManagerService.java:9543)
W/ActivityManager(  755):   at com.android.server.am.ActivityManagerService.makeAppCrashingLocked(ActivityManagerService.java:9436)
W/ActivityManager(  755):   at com.android.server.am.ActivityManagerService.crashApplication(ActivityManagerService.java:10081)
W/ActivityManager(  755):   at com.android.server.am.ActivityManagerService.handleApplicationCrashInner(ActivityManagerService.java:9632)
W/ActivityManager(  755):   at com.android.server.am.NativeCrashListener$NativeCrashReporter.run(NativeCrashListener.java:86)
I/ActivityManager(  755): Config changes=480 {1.0 222mcc10mnc it_IT ldltr sw360dp w360dp h567dp 480dpi nrml port finger -keyb/v/h -nav/h s.583}
I/ActivityManager(  755): Process com.example.soundvisualizer (pid 6959) has died.
W/ActivityManager(  755): No content provider found for permission revoke: file:///data/local/tmp/SoundVisualizer.apk
W/ActivityManager(  755): No content provider found for permission revoke: file:///data/local/tmp/SoundVisualizer.apk
I/ActivityManager(  755): Force stopping com.example.soundvisualizer appid=10126 user=-1: uninstall pkg
I/ActivityManager(  755): Force stopping com.example.soundvisualizer appid=10126 user=-1: update pkg
I/ActivityManager(  755): Force stopping com.example.soundvisualizer appid=10126 user=0: pkg removed

Eu não tenho nenhuma idéia sobre o que causa o erro e como posso corrigi-lo. Alguém pode me ajudar ? Desde já, obrigado.

editar encontrei http://publib.boulder.ibm.com/infocenter/realtime/v1r0/index.jsp?topic=/com.ibm.rt.doc.10/user/sighand.html no qual é explicado que tipo de erro é SIGABRT . a tabela diz que SIGABRT pode ser desativado usando -Xrs . Como posso usar -Xrs em Eclipse IDE ??

---

Top 5 Responder

1toni @

Isso acontece- me, neste caso :

I load a View onCreate and after a Function is called very fast and access to that view.

The View pode ser nulo em algum instante !!!

no seu caso colocar isso cada vez que você acessar esse ponto de vista :

if(mdrawer!=null){
   //DO Whatever
}else{
   Log.e(TAG,"ANDROID BUG");
}

EDIT: Eu percebi que não era porque a função chamada muito rápido. Foi porque eu tenho um Listener e eu não cancelar o registro quando OnDestroy (). E Quando OnCreate, eu tinha dois ouvinte. Um com resultado nulo e outro OK.

@Override
public void onDestroy() {                       
    super.onDestroy();
    if (mSensorManager!=null){mSensorManager.unregisterListener(listener);}
}