Kscrash: ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ трассировки стСка для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ C++ Π²ΠΎ встроСнных ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 20 Ρ„Π΅Π²Ρ€. 2017  Β·  12ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: kstenerud/KSCrash

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ функция __cxa_throw Π² KSCrashMonitor_CPPException.c Π½Π΅ вызываСтся, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ C++ Π²ΠΎ встроСнной срСдС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ CrashLib Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Crash-Tester.

Π― Π½Π΅ смог ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для этого. МнС каТСтся, Ρ‡Ρ‚ΠΎ любая встроСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ __cxa_throw ΠΈΠ· libc++, Π° Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² KSCrash.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ: ΠΊΠΎΠ³Π΄Π° Π²ΠΎ встроСнной ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ выдаСтся Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ C++, KSCrash Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²ΠΎ врСмя создания ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ stackCursor->advanceCursor Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ NULL Π² KSCrashReport.c:writeBacktrace().

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ: Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ​​информация ΠΎ сбоС 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 , Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли:

  1. __cxa_throw экспортируСтся ΠΈΠ· libKSCrash.dylib
  2. __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 .

cooked_throw

ВсС 12 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π£Π΄Π°Ρ‡ΠΈ с этим? Π― ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 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, поэтому:

  • Ссли KSCrash построСн ΠΊΠ°ΠΊ статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ связан с основным ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ трассировки ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ C++, Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ выдаСтся Π² основном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π½ΠΎ Π½Π΅ ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ· динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.
  • Ссли KSCrash построСн ΠΊΠ°ΠΊ статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ связан с динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ (ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ), Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ трассировки ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ C++, Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ выдаСтся ΠΈΠ· этой динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½ΠΎ Π½Π΅ ΠΈΠ· основного прилоТСния ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.
  • Ссли KSCrash построСн ΠΊΠ°ΠΊ раздСляСмая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ), Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Π΅ трассировки ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ C++, Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ выдаСтся ΠΈΠ· 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 , Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли:

  1. __cxa_throw экспортируСтся ΠΈΠ· libKSCrash.dylib
  2. __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 .

cooked_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,
kscrash

ΠΊΠ°ΠΊ это Ρ€Π΅ΡˆΠΈΡ‚ΡŒ?

ΠœΡ‹ создали PR, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ динамичСский Ρ…ΡƒΠΊ, упомянутый Π²Ρ‹ΡˆΠ΅ @huakucha : #375

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ