web-dev-qa-db-ja.com

Android致命的なシグナル11(SIGSEGV)、コード1、tid 29092のfault addr 0x0

ロード画面でロードアニメーションを再生しようとしていますが、Androidはgifをサポートしていないので、フレームに割り込んで再生するか、 Movieクラスを使用します。

主な活動はここにあります-

package com.myapp.mehul.login.activity;

import Android.app.Activity;
import Android.content.DialogInterface;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v7.app.AlertDialog;
import Android.util.Log;

import com.myapp.mehul.login.MYGIFView;
import com.myapp.mehul.login.MainActivity;
import com.myapp.mehul.login.R;
import com.myapp.mehul.login.app.Constants;

import org.json.JSONException;
import org.json.JSONObject;

import Java.net.URISyntaxException;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;


/**
 * Created by mehul on 2/6/16.
 */
public class LoadingScreen extends Activity {

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    /** Called when the activity is first created. */
    private Socket mSocket;
    String you;
    String opponentId;
    String username;

    {
        try {
            mSocket = IO.socket(Constants.CHAT_SERVER_URL);
        } catch (URISyntaxException e) {

            throw new RuntimeException(e);
        }
    }
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new MYGIFView(getApplicationContext()));
        //initialise the socket
        mSocket.connect();
        //call add user
        mSocket.emit("add user");
        //start a listener for opponent
        mSocket.on("opponent", onOpponent);
        //initialise the username
        username = getIntent().getExtras().getString("username");
    }

    private Emitter.Listener onOpponent = new Emitter.Listener(){
        @Override
        public  void call(final Object... args){
            LoadingScreen.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    JSONObject data = (JSONObject) args[0];

                    try {
                        you = data.getString("you");
                        opponentId = data.getString("opponent");
                        Log.d("LoadingScreen", data.toString());


                        //setResult(RESULT_OK, i);


                        finish();
                    } catch (JSONException e) {
                        return;
                    }
                    Intent i = new Intent(LoadingScreen.this, MainActivity.class);
                    i.putExtra("opponentId", opponentId);
                    i.putExtra("you", you);
                    i.putExtra("username", username);
                    Log.d("goToChat", username);
                    startActivity(i);
                }
            });
        }
    };

    @Override
    public void onBackPressed(){

        AlertDialog.Builder builder = new AlertDialog.Builder(LoadingScreen.this);
        builder.setMessage("I knew you didn't have BALLS.").setCancelable(
                false).setPositiveButton("I am a LOSER",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //send the logout information to the server
                        JSONObject discon = new JSONObject();
                        try {
                            discon.put("opponent", opponentId);
                            discon.put("you", you);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        mSocket.emit("discon", discon);
                        mSocket.disconnect();

                        //finish the current activity.
                        Intent intent = new Intent(LoadingScreen.this, MainMenu.class);
                        startActivity(intent);
                        LoadingScreen.this.finish();

                    }
                }).setNegativeButton("I'll fkin face it",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }

}

上記のコードでは、MYGIFView.classのインスタンスを渡すことでコンテンツビューを設定しました-

Heres MYGIFView.class

package com.myapp.mehul.login;

import Android.content.Context;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Movie;
import Android.view.View;

import Java.io.InputStream;

/**
 * Created by mehul on 2/7/16.
 */
public class MYGIFView extends View{
    Movie movie,movie1;

    InputStream is=null,is1=null;

    long moviestart;
    public MYGIFView(Context context) {
        super(context);

        is=context.getResources().openRawResource(+ R.drawable.loading);

        movie=Movie.decodeStream(is);

    }
    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawColor(Color.WHITE);
        super.onDraw(canvas);
        long now=Android.os.SystemClock.uptimeMillis();
        System.out.println("now="+now);
        if (moviestart == 0) { // first time
            moviestart = now;

        }
        System.out.println("\tmoviestart="+moviestart);
        int relTime = (int)((now - moviestart) % movie.duration()) ;
        System.out.println("time="+relTime+"\treltime="+movie.duration());
        movie.setTime(relTime);
        movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);
        this.invalidate();
    }
}

ロードアクティビティIS MYGIFView.classのインスタンスを作成し、データをログに記録しますが、致命的な信号11を出力します。検索しようとしましたが、応答がありませんでした。

コンソールログ-

02-07 12:22:30.321 29092-29092/? I/art: Late-enabling -Xcheck:jni
02-07 12:22:30.341 29092-29102/? I/art: Debugger is no longer active

02-07 12:22:30.422 29092-29092/? D/SQLiteHandler: Fetching user from Sqlite: {username=Harsh}
02-07 12:22:30.422 29092-29092/? D/LoginActivity: already logged in
02-07 12:22:30.425 29092-29092/? I/Timeline: Timeline: Activity_launch_request id:com.myapp.mehul.login time:71360781
02-07 12:22:30.487 29092-29092/? D/MainMenu: painted again
02-07 12:22:30.490 29092-29092/? D/SQLiteHandler: Fetching user from Sqlite: {username=Harsh}
02-07 12:22:30.554 29092-29149/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
02-07 12:22:30.559 29092-29092/? D/Atlas: Validating map...
02-07 12:22:30.596 29092-29149/? I/Adreno-EGL: <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_Android_LA.BF.1.1.1_RB1.05.01.00.042.030_msm8974_LA.BF.1.1.1_RB1__release_AU ()
                                               OpenGL ES Shader Compiler Version: E031.25.03.06
                                               Build Date: 04/15/15 Wed
                                               Local Branch: mybranch9068252
                                               Remote Branch: quic/LA.BF.1.1.1_rb1.19
                                               Local Patches: NONE
                                               Reconstruct Branch: AU_LINUX_Android_LA.BF.1.1.1_RB1.05.01.00.042.030 +  NOTHING
02-07 12:22:30.597 29092-29149/? I/OpenGLRenderer: Initialized EGL, version 1.4
02-07 12:22:30.611 29092-29149/? D/OpenGLRenderer: Enabling debug mode 0
02-07 12:22:30.660 29092-29092/? I/Timeline: Timeline: Activity_idle id: Android.os.BinderProxy@387f1572 time:71361016
02-07 12:22:31.898 29092-29092/com.myapp.mehul.login D/go to chat: was called
02-07 12:22:31.899 29092-29092/com.myapp.mehul.login I/Timeline: Timeline: Activity_launch_request id:com.myapp.mehul.login time:71362255
02-07 12:22:31.997 29092-29092/com.myapp.mehul.login I/System.out: now=71362353
02-07 12:22:31.997 29092-29092/com.myapp.mehul.login I/System.out:  moviestart=71362353
02-07 12:22:31.997 29092-29092/com.myapp.mehul.login I/System.out: time=0   reltime=1850
02-07 12:22:32.007 29092-29092/com.myapp.mehul.login A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 29092 (app.mehul.login)
02-07 12:22:32.541 29092-29092/com.myapp.mehul.login W/app.mehul.login: type=1701 audit(0.0:302): auid=4294967295 uid=10250 gid=10250 ses=4294967295 subj=u:r:untrusted_app:s0 reason="memory violation" sig=11
13
hashcode55

この質問のバッチを受け取ったので、よく見られているので、この質問に答えます-

私が理解したのは、次の行がエラーを投げていたことです-

movie.draw(canvas,this.getWidth()/2-20,this.getHeight()/2-40);

今、問題はこのエラーが多くの理由によって引き起こされる可能性があることであり、決して特定の理由ではありません..私の鉱山がうまくいかなかった理由は、私のデバイスがハードウェアアクセラレーションでうまく動作しなかったため、無効にするだけでしたマニフェストアプリケーションでこのように-

<Android:hardwareAccelerated="false">

理由は同じではない可能性があります....しかし、コアの理由は同じであり、メモリ関連であり、多くの場合、テスト対象のデバイスまたはエミュレータのファームウェアのバグです。

17
hashcode55

アクティビティのマニフェストセットで:

    <activity
        Android:name="LoadingScreen"
        Android:hardwareAccelerated="false">
    </activity>
10
George Sideris