簡體   English   中英

根據兩個參數為問題創建ID

[英]Creating ID for issues based on two parameters

一段時間以來,我一直在嘗試更改ACRA后端以包括問題ID,因此每個問題不會顯示為一個,而是顯示為具有報告計數的一個問題。 因此,我得出以下結論:

// Finds in array
function array_find($needle, $haystack) {
    foreach($haystack as $k => $v) {
        if (strstr($v, $needle) !== FALSE) {
            return $k;
        }
    }
    return FALSE;
}
function bicou_short_stack_trace($stack_trace, $package) {
    $lines = explode("\n", $stack_trace);
    if (array_find(": ", $lines) === FALSE && array_find($package, $lines) === FALSE) {
        $value = $lines[0];
    } else {
        $value = "";
        foreach ($lines as $id => $line) {
        if (/*strpos($line, ": ") !== FALSE || */strpos($line, $package) !== FALSE
             || strpos($line, "Error") !== FALSE || strpos($line, "ACRA caught a") !== FALSE) {
                $value .= $line . "<br />";
            }
        }
    }
    return $value;
}

function bicou_issue_id($stack_trace, $package) {
    return md5(bicou_short_stack_trace($stack_trace, $package));
}

這應該采用stacktrace並將其打包並將其轉換為一個問題ID,每當報告該問題時,該ID可以反復用於同一問題 所以我在我的應用程序中導致了以下錯誤:

PACKAGE_NAME = com.my.package
APP_VERSION_NAME = 1.1.5
LOGCAT = 07-14 15:51:20.891 V/MediaPlayer(31408): isPlaying: no active player
07-14 15:51:20.891 V/MediaPlayer-JNI(31408): isPlaying: 0
07-14 15:51:20.911 V/MediaPlayer(31408): isPlaying: no active player
07-14 15:51:20.911 V/MediaPlayer-JNI(31408): isPlaying: 0
07-14 15:51:20.931 V/MediaPlayer(31408): isPlaying: no active player
07-14 15:51:20.931 V/MediaPlayer-JNI(31408): isPlaying: 0
07-14 15:51:20.941 V/MediaPlayer(31408): isPlaying: no active player
07-14 15:51:20.941 V/MediaPlayer-JNI(31408): isPlaying: 0
07-14 15:51:20.961 V/MediaPlayer(31408): isPlaying: no active player
07-14 15:51:20.961 V/MediaPlayer-JNI(31408): isPlaying: 0
07-14 15:51:20.981 V/MediaPlayer(31408): isPlaying: no active player
07-14 15:51:20.981 V/MediaPlayer-JNI(31408): isPlaying: 0
07-14 15:51:22.651 W/SELinux (  566): SELinux: seapp_context_lookup: seinfo=default, level=s0:c512,c768, pkgname=com.my.package
07-14 15:51:22.661 I/art     (  566): Late-enabling -Xcheck:jni
07-14 15:51:22.681 D/TimaKeyStoreProvider(  566): TimaSignature is unavailable
07-14 15:51:22.681 D/ActivityThread(  566): Added TimaKeyStore provider
--------- beginning of system
07-14 15:51:22.711 W/ResourcesManager(  566): getTopLevelResources: /data/app/com.my.package-2/base.apk / 1.0 running in com.my.package rsrc of package com.my.package
07-14 15:51:22.731 I/InjectionManager(  566): Inside getClassLibPath + mLibMap{0=, 1=}
07-14 15:51:22.741 I/InjectionManager(  566): Inside getClassLibPath caller
07-14 15:51:22.741 D/ResourcesManager(  566): For user 0 new overlays fetched Null
07-14 15:51:22.751 W/System  (  566): ClassLoader referenced unknown path: /data/app/com.my.package-2/lib/arm64
07-14 15:51:22.791 I/ACRA    (  566): ACRA is enabled for com.my.package, initializing...
07-14 15:51:22.851 D/InjectionManager(  566): InjectionManager
07-14 15:51:22.851 D/InjectionManager(  566): fillFeatureStoreMap com.my.package
07-14 15:51:22.851 I/InjectionManager(  566): Constructor com.my.package, Feature store :{}
07-14 15:51:22.851 I/InjectionManager(  566): featureStore :{}
07-14 15:51:22.851 W/SELinux (  613): SELinux: seapp_context_lookup: seinfo=default, level=s0:c512,c768, pkgname=com.my.package:acra
07-14 15:51:22.861 I/art     (  613): Late-enabling -Xcheck:jni
07-14 15:51:22.861 W/ResourcesManager(  566): getTopLevelResources: /data/app/com.my.package-2/base.apk / 1.0 running in com.my.package rsrc of package com.my.package
07-14 15:51:22.861 W/ResourcesManager(  566): getTopLevelResources: /data/app/com.my.package-2/base.apk / 1.0 running in com.my.package rsrc of package com.my.package
07-14 15:51:22.881 D/TimaKeyStoreProvider(  613): TimaSignature is unavailable
07-14 15:51:22.881 D/ActivityThread(  613): Added TimaKeyStore provider
07-14 15:51:22.901 I/InjectionManager(  613): Inside getClassLibPath + mLibMap{0=, 1=}
07-14 15:51:22.901 W/ResourcesManager(  613): getTopLevelResources: /data/app/com.my.package-2/base.apk / 1.0 running in com.my.package rsrc of package com.my.package
07-14 15:51:22.901 D/ResourcesManager(  613): For user 0 new overlays fetched Null
07-14 15:51:22.911 I/InjectionManager(  613): Inside getClassLibPath caller
07-14 15:51:22.911 W/System  (  613): ClassLoader referenced unknown path: /data/app/com.my.package-2/lib/arm64
07-14 15:51:22.931 D/Activity(  566): performCreate Call Injection manager
07-14 15:51:22.941 I/InjectionManager(  566): dispatchOnViewCreated > Target : com.my.package.Splash isFragment :false
07-14 15:51:22.941 D/InjectionManager(  613): InjectionManager
07-14 15:51:22.941 D/InjectionManager(  613): fillFeatureStoreMap com.my.package
07-14 15:51:22.941 I/InjectionManager(  613): Constructor com.my.package, Feature store :{}
07-14 15:51:22.941 I/InjectionManager(  613): featureStore :{}
07-14 15:51:22.941 D/ViewRootImpl(  566): #1 mView = com.android.internal.policy.PhoneWindow$DecorView{f80c5e I.E...... R.....ID 0,0-0,0}
07-14 15:51:22.941 D/SecWifiDisplayUtil(  566): Metadata value : SecSettings2
07-14 15:51:22.951 D/OpenGLRenderer(  566): Use EGL_SWAP_BEHAVIOR_PRESERVED: true
07-14 15:51:23.051 D/libEGL  (  566): loaded /vendor/lib64/egl/libGLES_mali.so
07-14 15:51:23.071 D/libEGL  (  566): eglInitialize EGLDisplay = 0x7f97440178
07-14 15:51:23.071 I/OpenGLRenderer(  566): Initialized EGL, version 1.4
07-14 15:51:23.071 D/        (  566): ro.exynos.dss isEnabled: 0
07-14 15:51:23.081 D/mali_winsys(  566): new_window_surface returns 0x3000,  [1440x2560]-format:1
07-14 15:51:23.121 D/ViewRootImpl(  566): MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
07-14 15:51:23.181 D/ViewRootImpl(  566): #3 mView = null
07-14 15:51:23.191 E/ViewRootImpl(  566): sendUserActionEvent() mView == null
07-14 15:51:23.301 E/ViewRootImpl(  566): sendUserActionEvent() mView == null
07-14 15:51:25.941 I/Timeline(  566): Timeline: Activity_launch_request id:com.my.package time:414449072
07-14 15:51:26.021 W/ResourcesManager(  566): getTopLevelResources: /data/app/com.my.package-2/base.apk / 1.0 running in com.my.package rsrc of package com.my.package
07-14 15:51:26.171 D/AndroidRuntime(  566): Shutting down VM
07-14 15:51:26.171 E/ACRA    (  566): ACRA caught a RuntimeException for com.my.package
07-14 15:51:26.171 E/ACRA    (  566): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package/com.my.package.Game}: android.view.InflateException: Binary XML file line #21: Binary XML file line #21: Error inflating class com.my.package.Clicker
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3254)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.ActivityThread.access$1100(ActivityThread.java:222)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)
07-14 15:51:26.171 E/ACRA    (  566):   at android.os.Handler.dispatchMessage(Handler.java:102)
07-14 15:51:26.171 E/ACRA    (  566):   at android.os.Looper.loop(Looper.java:158)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.ActivityThread.main(ActivityThread.java:7229)
07-14 15:51:26.171 E/ACRA    (  566):   at java.lang.reflect.Method.invoke(Native Method)
07-14 15:51:26.171 E/ACRA    (  566):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
07-14 15:51:26.171 E/ACRA    (  566):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
07-14 15:51:26.171 E/ACRA    (  566): Caused by: android.view.InflateException: Binary XML file line #21: Binary XML file line #21: Error inflating class com.my.package.Clicker
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
07-14 15:51:26.171 E/ACRA    (  566):   at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:474)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.Activity.setContentView(Activity.java:2387)
07-14 15:51:26.171 E/ACRA    (  566):   at com.my.package.Game.onCreate(Game.java:62)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.Activity.performCreate(Activity.java:6876)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
07-14 15:51:26.171 E/ACRA    (  566):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207)
07-14 15:51:26.171 E/ACRA    (  566):   ... 9 more
07-14 15:51:26.171 E/ACRA    (  566): Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class com.my.package.Clicker
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.createView(LayoutInflater.java:657)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.rInflate(LayoutInflater.java:855)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
07-14 15:51:26.171 E/ACRA    (  566):   ... 17 more
07-14 15:51:26.171 E/ACRA    (  566): Caused by: java.lang.reflect.InvocationTargetException
07-14 15:51:26.171 E/ACRA    (  566):   at java.lang.reflect.Constructor.newInstance(Native Method)
07-14 15:51:26.171 E/ACRA    (  566):   at android.view.LayoutInflater.createView(LayoutInflater.java:631)
07-14 15:51:26.171 E/ACRA    (  566):   ... 24 more
07-14 15:51:26.171 E/ACRA    (  566): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
07-14 15:51:26.171 E/ACRA    (  566):   at com.my.package.Clicker.init(Clicker.java:241)
07-14 15:51:26.171 E/ACRA    (  566):   at com.my.package.Clicker.<init>(Clicker.java:217)
07-14 15:51:26.171 E/ACRA    (  566):   ... 26 more
PHONE_MODEL = SM-G925F
ANDROID_VERSION = 6.0.1

除每行前面定義的時間外,其他時間完全相同。

對於問題:每次輸入完全相同,但每次生成的ID都不相同。 我造成了3次,這是ID:

69b30e6cff3768ff3e3616d85a4b2ea8
e2c090b737a4e854106c373fa408779c
038e70fe97be4e23cac2d6bb42df751c

.txt文件的前兩行和后兩行不包括stacktrace。

我怎樣才能解決這個問題? 確實很煩人,因為花了很長時間才編寫出上面的代碼,並且不起作用。

要說明:

如果stacktrace相同,我希望output(ID)相同,但它似乎無法正常工作。

編輯:

感謝Samurai8,我設法做到了:

$reworkedLog = $LOG;
$reworkedLog = str_replace('LOGCAT =', '', $reworkedLog);

$reworkedLog = preg_replace("'\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d*'", '', $reworkedLog);
$reworkedLog = preg_replace("'$\d*'", '', $reworkedLog);
$reworkedLog = preg_replace("'0x[0-9a-f]*'", '', $reworkedLog);
$reworkedLog = preg_replace("'(\d{5})'",'', $reworkedLog);
$reworkedLog = preg_replace("'... \d{1} more'", '', $reworkedLog);
$reworkedLog = preg_replace("'... \d{2} more'", '', $reworkedLog);

$issue_id = bicou_issue_id($reworkedLog, $package) . '<br>';

這使得每次錯誤md5都相同

您應該牢記三件事:

  • md5是哈希函數。 這意味着許多輸入具有相同的輸出。 您永遠不能保證兩個完全不同的堆棧跟蹤會產生不同的ID。 這意味着即使id已經在系統中,您也不能盲目地忽略堆棧跟蹤。
  • 輸入的微小差異將導致不同的哈希值。 在堆棧跟蹤中添加單個空格或更改單個字符將導致生成不同的哈希,從而為您提供不同的ID。
  • 堆棧跟蹤通常包含執行日期和時間代碼,對象的存儲位置和實例化編號。 在您的情況下,您的logcat包含所有這些:

     07-14 15:51:20.891 

     eglInitialize EGLDisplay = 0x7f97440178 

     at android.app.ActivityThread.access$1100 

    堆棧跟蹤本身僅包含日期和實例化編號,但足以創建另一個ID。


你能做什么? 我們可以從生成id的堆棧跟蹤中剝離它們。 我們可能希望將它們留在實際的堆棧跟蹤中,因為它提供了一些上下文。 只需使用以下正則表達式對它們進行preg_replace(..)

  • \\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d*表示日期和時間
  • \\$\\d*用於匿名類
  • 0x[0-9a-f]*表示十六進制值,它可能是每次運行都會更改的內存位置。

當然,這增加了id唯一的機會,但是我們已經確定您無論如何都要記錄每個錯誤。 某些東西被賦予相同ID的機會應該很小,但是請確保無論您記錄這些錯誤的位置在何處都可以拆分錯誤報告,以防兩個不同的錯誤被記錄在同一ID下。 或者,為每個崩潰報告使用唯一的ID,然后根據計算出的ID自動建議重復的ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM