Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java代码混淆后crash还原的代码行号不对 #25

Closed
lxzh opened this issue Nov 19, 2019 · 3 comments
Closed

java代码混淆后crash还原的代码行号不对 #25

lxzh opened this issue Nov 19, 2019 · 3 comments
Labels
invalid This doesn't seem right

Comments

@lxzh
Copy link

lxzh commented Nov 19, 2019

这里加了混淆,修改了一下测试用例testJavaCrash,但发现混淆后堆栈的代码行号不对。如下:
crash:trace

        ...
     Caused by: java.lang.RuntimeException: test java exception
        at a.l.a(XCrash.java:44)
        at xcrash.sample.MainActivity.testJavaCrashInMainThread_onClick(MainActivity.java:1)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:3) 
        ...

这里面还原的几个行号都比较奇怪,如at a.l.a(XCrash.java:44)这个44行
apk
smali文件

@lxzh
Copy link
Author

lxzh commented Nov 19, 2019

哦,了解了,这个行号是混淆后处理了的行号,这个44行号可以在a.l.smali文件可以找到crash的位置。
如:
crash发生在XCrash.java的51行:

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.substring(int)' on a null object reference
        at a.l.a(XCrash.java:51)
        at xcrash.sample.MainActivity.testJavaCrashInMainThread_onClick(MainActivity.java:1)
        at java.lang.reflect.Method.invoke(Native Method) 

实际上是a.l.smali文件中.line51对应的代码:

    .line 51
    sget-object v0, La/l;->e:La/g;

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v4, "testJavaCrash case:4 str="

    invoke-virtual {v2, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {p0, v1}, Ljava/lang/String;->substring(I)Ljava/lang/String;

    move-result-object p0

    invoke-virtual {v2, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p0

    invoke-interface {v0, v3, p0}, La/g;->b(Ljava/lang/String;Ljava/lang/String;)V

    goto :goto_0

对应的mapping文件:

    38:40:void testJavaCrash(boolean):885:887 -> a
    41:41:void testJavaCrash(boolean):892:892 -> a
    42:43:void testJavaCrash(boolean):898:899 -> a
    44:44:void testJavaCrash(boolean):901:901 -> a
    45:50:void testJavaCrash(boolean):922:927 -> a
    51:51:void testJavaCrash(boolean):919:919 -> a
    52:53:void testJavaCrash(boolean):914:915 -> a
    54:56:void testJavaCrash(boolean):907:909 -> a

因此这个51行就对应原文件的919行,原文件:

917            case 4:
918                String str = null;
919                logger.d(TAG, "testJavaCrash case:4 str=" + str.substring(3));
920                break;

刚好吻合

@lxzh
Copy link
Author

lxzh commented Nov 19, 2019

但奇怪的是用retrace还原crash堆栈,并没有校正行号

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.substring(int)' on a null object reference
        at xcrash.XCrash.void testJavaCrash(boolean)(XCrash.java:51)
        at xcrash.sample.MainActivity.void testJavaCrashInMainThread_onClick(android.view.View)(MainActivity.java:1)
        at java.lang.reflect.Method.invoke(Native Method)?

@lxzh lxzh closed this as completed Nov 22, 2019
@caikelun
Copy link
Collaborator

xCrash 投递的 java 崩溃的 stacktrace 信息,是通过注册 jvm 标准的 Thread.setDefaultUncaughtExceptionHandler 获取的,并未对 stacktrace 信息做任何修改。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
invalid This doesn't seem right
Projects
None yet
Development

No branches or pull requests

2 participants