ΠΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ __cxa_throw Π² KSCrashMonitor_CPPException.c Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ C++ Π²ΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Π΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ CrashLib Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Crash-Tester.
Π― Π½Π΅ ΡΠΌΠΎΠ³ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ. ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π»ΡΠ±Π°Ρ Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ __cxa_throw ΠΈΠ· libc++, Π° Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² KSCrash.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ: ΠΊΠΎΠ³Π΄Π° Π²ΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ Π²ΡΠ΄Π°Π΅ΡΡΡ Π½Π΅ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ C++, KSCrash Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΡΡΠ΅ΡΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ stackCursor->advanceCursor Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π΅Π½ NULL Π² KSCrashReport.c:writeBacktrace().
ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ββΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ±ΠΎΠ΅ KSCrash Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΡΡΠ΅ΡΠΎΠ².
Π£Π΄Π°ΡΠΈ Ρ ΡΡΠΈΠΌ? Π― ΠΏΡΡΠ°ΡΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ KSCrash Π² ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π·Π°ΡΡΡΡΠ» ΠΈΠ·-Π·Π° Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΡΠ΅Π΄Ρ.
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π΄Π°ΠΉΡΠ΅ ΠΌΠ½Π΅ Π·Π½Π°ΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ.
ΠΠ΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, ΠΈ Ρ Π½Π΅ Π²Π΅ΡΡ, ΡΡΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, Π½Π΅ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΎ ΠΌΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡΠΈΡΡΠ°ΡΠΈΠΈ:
KSCrash Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ ΡΡΠ΅ΠΊΠ° ΠΏΡΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ __cxa_throw, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠ΅ΠΊΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΠΊΡΡΡΠ΅Π½ libc++. ΠΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° KSCrash ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²ΡΠ·Π°Π½ Ρ ΠΊΠΎΠ΄ΠΎΠΌ C++, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊ Π½Π°ΠΉΠ΄Π΅Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ __cxa_throw ΠΈΠ· ΡΠΎΡΠΌΡ KSCrash Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² libc++. ΠΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, ΡΡΡΠ»Π°ΡΡΠ΅Π³ΠΎΡΡ Π½Π° libc++, Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ __cxa_throw ΠΈΠ· libc++, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π½Π΅ Π·Π½Π°Π΅Ρ ΠΎ ΠΊΠΎΠ΄Π΅ Π² KSCrash. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅ΡΡΡ ΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ, Π½ΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π΄Π°ΠΉΡΠ΅ ΠΌΠ½Π΅ Π·Π½Π°ΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅.
Π£ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ. ΠΠΎ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ.
Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» PLCrashReporter, Ρ Π½ΠΈΠΌ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
ΠΠ·Π½Π°ΡΠ°Π΅Ρ Π»ΠΈ ΡΡΠΎ, ΡΡΠΎ KSCrash Π² ΠΈΠ΄Π΅Π°Π»Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ ΡΠ²ΡΠ·Π°Π½ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΡΡΠΎΠ±Ρ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ C++, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠ΅ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ?
ΠΠΎ ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΎΡΡΠ°Π²ΠΈΡ Π»ΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π² Π»ΡΠ±ΠΎΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅, Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ΅Π½Π½ΡΠΌΠΈ KSCrash, Π΅ΡΠ»ΠΈ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ Π²Π°Ρ ΠΎΡΡΠ΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ @pdrtrifork ? ΠΡΠ»ΠΈ ΠΌΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΠΌ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ ΡΠ²ΡΠ·Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ Π·Π°Π³Π»ΡΡΠΊΠΈ __cxa_throw, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡΡΡ Π½Π° ΠΎΠ±ΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ KSCrash?
Π₯Π°, ΡΠ°ΠΊ ΡΡΠΎ, ΡΠ°ΡΡΠ»Π΅Π΄ΡΡ ΡΡΠΎ, Ρ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π·Π΄Π΅ΡΡ http://stackoverflow.com/questions/36846628/conditionally-overriding-cxa-throw , ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΠΎΡΠΊΡΡΡ Π½Π°ΡΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ @kstenerud π
Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, PR #219 Π΄ΠΎΠ»ΠΆΠ΅Π½, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡ ΡΠ±ΠΎΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΡΡΠ΅ΡΠΎΠ² ΠΎ ΡΠ±ΠΎΡΡ .
@kstenerud Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ Π²ΠΎ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ _ Β«ΠΡΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅ΠΊΠ° Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ C ++, ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ
ΠΈΠ· ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Ρ KSCrashΒ» _. ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΌΠΎΠ³Ρ ΡΡΠ΄ΠΈΡΡ, ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ __cxa_throw
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·Π΅, ΡΡΠΎ ΠΈ KSCrash, ΠΏΠΎΡΡΠΎΠΌΡ:
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠ°ΠΊΠΈΡ
ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΠΊΠ°ΠΊ sentry-swift
, https://docs.sentry.io/clients/cocoa/ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ KSCrash Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
ΠΠΎΡΠ»Π΅ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΡΠ°ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π±ΡΠ» Π½Π΅Π²Π΅ΡΠ½ΡΠΌ:
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°ΡΡ Π²ΠΎ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ _"ΠΡΡΡΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅ΠΊΠ° Π΄Π»Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ C++, ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Ρ KSCrash"_.
Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ KSCrash ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°:
MyApplication
( main.o
, libKSCrash.a
)libDynamicLibrary.dylib
( lib.o
)/usr/lib/libc++abi.dylib
ΠΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· MyApplication
, ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² libKSCrash.a::__cxa_throw
. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ libKSCrash.a
ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ __cxa_throw
ΠΊΠ°ΠΊ weak
, ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ° MyApplication
Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ main.o
ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ __cxa_throw
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ. ΠΡΠ΅ ΠΈΠ΄Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ Π² ΡΡΠΎΠΌ ΠΎΡΡΠ΅ΡΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π»ΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· libDynamicLibrary.dylib
, Π½Π΅ Π²ΡΠ·ΠΎΠ²ΡΡ libKSCrash.a::__cxa_throw
ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠ°ΡΡΡ Π² /usr/lib/libc++abi.dylib::__cxa_throw
.
Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ KSCrash ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°:
MyApplication
( main.o
)libKSCrash.dylib
/usr/lib/libc++abi.dylib
libDynamicLibrary.dylib
( lib.o
)/usr/lib/libc++abi.dylib
ΠΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· MyApplication
, ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² libKSCrash.dylib::__cxa_throw
, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ:
__cxa_throw
ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΡΡΡ ΠΈΠ· libKSCrash.dylib
__cxa_throw
Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ weak
ΠΡΠ»ΠΈ __cxa_throw
ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ weak
( 0000000000002e90 (__TEXT,__text) weak external ___cxa_throw
), ΡΠΎ ΠΏΡΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠΈ libKSCrash.dylib
ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΠΌΠΎΡΡΠΈΡ Π½Π° /usr/lib/libc++abi.dylib
, Π½Π°Ρ
ΠΎΠ΄ΠΈΡ Π½Π΅ -weak __cxa_throw
ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ libKSCrash.dylib::__cxa_throw
ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π±ΡΠΎΡΠΊΠ° ΠΈΠ· MyApplication
libKSCrash.dylib::__cxa_throw
Π·Π°ΡΠ΅ΠΌ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ.
ΠΡΠΎ Π½Π°Π²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ Π½Π° ΠΌΡΡΠ»Ρ, ΡΡΠΎ Π°ΡΡΠΈΠ±ΡΡ weak
ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ KSCrash ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
ΠΠ°ΠΊ ΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π»ΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· libDynamicLibrary.dylib
, Π½Π΅ Π²ΡΠ·ΠΎΠ²ΡΡ libKSCrash.dylib::__cxa_throw
ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠ°ΡΡΡ Π² /usr/lib/libc++abi.dylib::__cxa_throw
.
ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΡΠ°Π½Π΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ
ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ Π½Π° __cxa_throw
. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ Π² ΡΡΠ°ΡΡΠ΅, Ρ ΡΠ±Π΅Π΄ΠΈΠ»ΡΡ, ΡΡΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π΄Π»Ρ __cxa_throw
.
Π― ΠΏΡΡΠ°ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ±ΠΎΠΉ Π² ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΆΡΡΠ½Π°Π» ΡΠ±ΠΎΠ΅Π², Ρ Π²ΠΈΠΆΡ, ΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ±ΠΎΠΉ, Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ±ΠΎΠΉ KSCrash.
ΠΡΠΎ ΡΠ° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°?
Π‘Π±ΠΎΠΉ ΠΏΠΎΡΠΎΠΊΠ° 0:
0 libsystem_kernel.dylib 0x0000000181cc5348 0x181ca4000 + 136008 (__pthread_kill + 8)
1 libsystem_pthread.dylib 0x0000000181ddd7a4 0x181dd6000 + 30628 ( + 360)
2 libsystem_c.dylib 0x0000000181c34fd8 0x181bd2000 + 405464 (ΠΎΡΠΌΠ΅Π½Π° + 140)
3 libc++abi.dylib 0x0000000181698068 0x181696000 + 8296 ( + 132)
4 libc++abi.dylib 0x0000000181698210 0x181696000 + 8720 ( + 304)
5 libobjc.A.dylib 0x00000001816c0810 0x1816b8000 + 34832 ( + 124)
6 KSCrash 0x00000001054a0590 0x10549c000 + 17808 (kscm_cppexception_getAPI + 280)
7 libc++abi.dylib 0x00000001816b054c 0x181696000 + 107852 ( + 16)
8 libc++abi.dylib 0x00000001816b0158 0x181696000 + 106840 (__cxa_rethrow + 144)
9 libobjc.A.dylib 0x00000001816c06e8 0x1816b8000 + 34536 (objc_exception_rethrow + 44)
10 CoreFoundation 0x0000000182072344 0x18206a000 + 33604 (CFRunLoopRunSpecific + 544)
11 GraphicsServices 0x0000000183f03f84 0x183ef9000 + 44932 (GSEventRunModal + 100)
12 UIKit 0x000000018b61e880 0x18b5ab000 + 473216 (UIApplicationMain + 208)
@torarnv ΠΡΠΈΠ²Π΅Ρ, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ Π½Π°ΠΌΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠ΅ΠΉ mach-o-hook? Π― ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ EXC_BAD_ACCESS ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ mach_hook
__cxa_throw.
void ter_handler(){
printf("custom handler\n");
}
void test(){
throw std::runtime_error("test function");
}
static void (*orig_throw)(void * thrown_exception, std::type_info *tinfo, void (*dest)(void *));
void hooked_throw(void * thrown_exception, std::type_info *tinfo, void (*dest)(void *)){
printf("hooked_throw...\n");
return orig_throw(thrown_exception, tinfo, dest);
}
int main(int argc, char * argv[])
{
<strong i="5">@autoreleasepool</strong> {
struct rebinding binds[1];
struct rebinding bind1 = {"__cxa_throw", (void *)hooked_throw, (void **)&orig_throw};
binds[0] = bind1;
rebind_symbols(binds, 1);
std::set_terminate(ter_handler);
try {
throw std::runtime_error("test error");
}
catch (...){
printf ("catch exception\n");
}
test();
}
}
ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉ ΡΡΠΎ... ΡΠ΄Π°ΡΠΈ
Π― Π²ΡΡΡΠ΅ΡΠ°Ρ ΠΎΠ΄ΠΈΠ½ ΠΊΡΠ°Ρ Ρ KSCrash,
ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΅ΡΠΈΡΡ?
ΠΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ PR, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ Ρ ΡΠΊ, ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ Π²ΡΡΠ΅ @huakucha : #375
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠΎΡΠ»Π΅ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΡΠ°ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π±ΡΠ» Π½Π΅Π²Π΅ΡΠ½ΡΠΌ:
Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ KSCrash ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°:
MyApplication
(main.o
,libKSCrash.a
)libDynamicLibrary.dylib
(lib.o
)/usr/lib/libc++abi.dylib
ΠΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·
MyApplication
, ΠΏΠΎΠΏΠ°Π΄ΡΡ Π²libKSCrash.a::__cxa_throw
. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡlibKSCrash.a
ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ__cxa_throw
ΠΊΠ°ΠΊweak
, ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°MyApplication
Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈmain.o
ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ__cxa_throw
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ. ΠΡΠ΅ ΠΈΠ΄Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ Π² ΡΡΠΎΠΌ ΠΎΡΡΠ΅ΡΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π»ΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·libDynamicLibrary.dylib
, Π½Π΅ Π²ΡΠ·ΠΎΠ²ΡΡlibKSCrash.a::__cxa_throw
ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠ°ΡΡΡ Π²/usr/lib/libc++abi.dylib::__cxa_throw
.Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ KSCrash ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°:
MyApplication
(main.o
)libKSCrash.dylib
/usr/lib/libc++abi.dylib
libDynamicLibrary.dylib
(lib.o
)/usr/lib/libc++abi.dylib
ΠΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·
MyApplication
, ΠΏΠΎΠΏΠ°Π΄ΡΡ Π²libKSCrash.dylib::__cxa_throw
, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ:__cxa_throw
ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΡΡΡ ΠΈΠ·libKSCrash.dylib
__cxa_throw
Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊweak
ΠΡΠ»ΠΈ
__cxa_throw
ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊweak
(0000000000002e90 (__TEXT,__text) weak external ___cxa_throw
), ΡΠΎ ΠΏΡΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠΈlibKSCrash.dylib
ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΠΌΠΎΡΡΠΈΡ Π½Π°/usr/lib/libc++abi.dylib
, Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π½Π΅ -weak__cxa_throw
ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎlibKSCrash.dylib::__cxa_throw
ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ. ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π±ΡΠΎΡΠΊΠ° ΠΈΠ·MyApplication
libKSCrash.dylib::__cxa_throw
Π·Π°ΡΠ΅ΠΌ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ.ΠΡΠΎ Π½Π°Π²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ Π½Π° ΠΌΡΡΠ»Ρ, ΡΡΠΎ Π°ΡΡΠΈΠ±ΡΡ
weak
ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΠ±ΠΎΡΠΊΠ΅ KSCrash ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.ΠΠ°ΠΊ ΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π»ΡΠ±ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·
libDynamicLibrary.dylib
, Π½Π΅ Π²ΡΠ·ΠΎΠ²ΡΡlibKSCrash.dylib::__cxa_throw
ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠ°ΡΡΡ Π²/usr/lib/libc++abi.dylib::__cxa_throw
.ΠΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΡΠ°Π½Π΅Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ Π½Π°
__cxa_throw
. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ Π² ΡΡΠ°ΡΡΠ΅, Ρ ΡΠ±Π΅Π΄ΠΈΠ»ΡΡ, ΡΡΠΎ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Π΄Π»Ρ__cxa_throw
.