Kscrash: рдПрдореНрдмреЗрдбреЗрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ C++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдлрд╝рд░ре░ 2017  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: kstenerud/KSCrash

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ KScrashMonitor_CPPException.c рдореЗрдВ __cxa_throw рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрдм рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ C++ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХреНрд░реИрд╢-рдЯреЗрд╕реНрдЯрд░ рдРрдк рдореЗрдВ CrashLibред

рдореИрдВ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рдкрд╛рдпрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдПрдореНрдмреЗрдбреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдореЗрд╢рд╛ libc++ рд╕реЗ __cxa_throw рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреА, рди рдХрд┐ KSCrash рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд: рдЬрдм рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓ рди рдХрд┐рдпрд╛ рдЧрдпрд╛ C++ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ KScrash рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ stackCursor->advansCursor KSCrashReport.c:writeBacktrace() рдореЗрдВ NULL рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЬрд╛рдирдХрд╛рд░реА 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 рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдПрдХ рдЧреИрд░ рдЦреЛрдЬреЗрдВ -рдХрдордЬреЛрд░ __cxa_throw , рдФрд░ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗрдВ рдХрд┐ libKSCrash.dylib::__cxa_throw рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред MyApplication рд╕реЗ рдереНрд░реЛ рдЯрд╛рдЗрдо рдкрд░ рд░рдирдЯрд╛рдЗрдо рд╕рд┐рдВрдмрд▓ рд▓реБрдХрдЕрдк рдХреЗ рджреМрд░рд╛рди, libKSCrash.dylib::__cxa_throw рдХреЛ рдлрд┐рд░ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ weak рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддрднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреЛ рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣, libDynamicLibrary.dylib libKSCrash.dylib::__cxa_throw рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ /usr/lib/libc++abi.dylib::__cxa_throw рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ред

__cxa_throw рдХреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдХреБрдЫ рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдкреИрдЪрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВрдиреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рддрдХрдиреАрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ __cxa_throw рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИред

cooked_throw

рд╕рднреА 12 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рднрд╛рдЧреНрдп? рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдореНрдмреЗрдбреЗрдб рдврд╛рдВрдЪреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдЯрдХ рдЧрдпрд╛ред
рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЙрдкрд╛рдп рд╣реИред

рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВ, рдФрд░ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреА рдореЗрд░реА рд╕рдордЭ рд╣реИ:

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ KScrash рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ __cxa_throw рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдХрд░ рд╣реИ, рдЬреЛ рдХрд┐ libc++ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рд╕реА ++ рдХреЛрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд┐рдВрдХрд░ libc++ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрдЬрд╛рдп __cxa_throw рдлреЙрд░реНрдо KScrash рдвреВрдВрдвреЗрдЧрд╛ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдПрдореНрдмреЗрдбреЗрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬреЛ libc++ рд╕реЗ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ, libc++ рд╕реЗ __cxa_throw рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ KSCrash рдореЗрдВ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдореНрдмреЗрдбреЗрдб рдврд╛рдВрдЪреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдореНрдмреЗрдбреЗрдб рдврд╛рдВрдЪреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдореИрдВрдиреЗ PLCrashReporter рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреЛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдо рд╕реЗ рдХрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рд╕реА ++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП?

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЖрдкрдХреА рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ @pdrtrifork рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рддреЛ рд╡рд╣ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ рдЬреЛ KSCrash рджреНрд╡рд╛рд░рд╛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ? рдпрджрд┐ рд╣рдо рдПрдореНрдмреЗрдбреЗрдб рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдм рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рд▓рд┐рдм рдореЗрдВ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдЙрд╕ __cxa_throw рд╕реНрдЯрдм рдХреЗ рд╕рд╛рде, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдЭрд╛ KScrash рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдЧрд╛?

рд╣рд╛рдВ, рддреЛ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдореЗрдВ рдореИрдВ рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ http://stackoverflow.com/questions/36846628/conditionally-overriding-cxa-throw , рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ @kstenerud рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛

рд╡реИрд╕реЗ рднреА, рдкреАрдЖрд░ #219 рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХреНрд░реИрд╢ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

@kstenerud рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ _ "рд╕реА ++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреБрдо рд╕реНрдЯреИрдХ рдирд┐рд╢рд╛рди рдЫрд╡рд┐рдпреЛрдВ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ" _ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, __cxa_throw рдУрд╡рд░рд░рд╛рдЗрдб рдХреЗрд╡рд▓ рдЙрд╕реА рдЫрд╡рд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢, рдЗрд╕рд▓рд┐рдП:

  • рдпрджрд┐ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдПрдХ рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдРрдк рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдореБрдЦреНрдп рдРрдк рдореЗрдВ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдкрд░ рд╕реА ++ рдЕрдкрд╡рд╛рдж рдмреИрдХрдЯреНрд░реИрдХ рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдлреЗрдВрдХрдиреЗ рдкрд░ рдирд╣реАрдВ
  • рдпрджрд┐ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдПрдХ рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдЧрддрд┐рд╢реАрд▓ (рдЖрд╡рд░рдг) рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реА ++ рдЕрдкрд╡рд╛рдж рдмреИрдХрдЯреНрд░реИрд╕ рдорд┐рд▓рддрд╛ рд╣реИ рдпрджрд┐ рдЙрд╕ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдРрдк, рдпрд╛ рдЕрдиреНрдп рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдирд╣реАрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдпрджрд┐ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреЛ рдПрдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдврд╛рдВрдЪреЗ) рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реА ++ рдЕрдкрд╡рд╛рдж рдмреИрдХрдЯреНрд░реЗрд╕ рдорд┐рд▓рддреЗ рд╣реИрдВ рдпрджрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдРрдк рдпрд╛ рдЕрдиреНрдп рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рдлреЗрдВрдХреЗ рдЬрд╛рдиреЗ рдкрд░ рдирд╣реАрдВ

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ sentry-swift , https://docs.sentry.io/clients/cocoa/ , рдЬреЛ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреЛ рдПрдХ рдврд╛рдВрдЪреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИред

рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдЧрд▓рдд рдереА:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ _ "рд╕реА ++ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреБрдо рд╕реНрдЯреИрдХ рдирд┐рд╢рд╛рди рдЫрд╡рд┐рдпреЛрдВ рд╕реЗ рдлреЗрдВрдХреЗ рдЧрдП рд╣реИрдВ рдЬреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ" _ред

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 рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ, рдПрдХ рдЧреИрд░ рдЦреЛрдЬреЗрдВ -рдХрдордЬреЛрд░ __cxa_throw , рдФрд░ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗрдВ рдХрд┐ libKSCrash.dylib::__cxa_throw рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред MyApplication рд╕реЗ рдереНрд░реЛ рдЯрд╛рдЗрдо рдкрд░ рд░рдирдЯрд╛рдЗрдо рд╕рд┐рдВрдмрд▓ рд▓реБрдХрдЕрдк рдХреЗ рджреМрд░рд╛рди, libKSCrash.dylib::__cxa_throw рдХреЛ рдлрд┐рд░ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ weak рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддрднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреЛ рд╕реНрдерд┐рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣, libDynamicLibrary.dylib libKSCrash.dylib::__cxa_throw рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ /usr/lib/libc++abi.dylib::__cxa_throw рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ред

__cxa_throw рдХреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдХреБрдЫ рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдкреИрдЪрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдВрдиреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рддрдХрдиреАрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ __cxa_throw рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИред

cooked_throw

рдореИрдВ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдврд╛рдВрдЪреЗ рдореЗрдВ рджреБрд░реНрдШрдЯрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЬрдм рдореИрдВ рдХреНрд░реИрд╢ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд░реИрд╢ рдирд╣реАрдВ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ рдХреНрд░реИрд╢ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рд╡рд╣реА рдореБрджреНрджрд╛ рд╣реИ?

рдереНрд░реЗрдб 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 0x000001816c0810 0x1816b8000 + 34832 ( + 124)
6 рдХреЗрдПрд╕рд╕реАрд░рд╛рд╢ 0x00000001054a0590 0x10549c000 + 17808 (kscm_cppexception_getAPI + 280)
7 libc++abi.dylib 0x000001816b054c 0x181696000 + 107852 (+16)
8 libc++abi.dylib 0x000001816b0158 0x181696000 + 106840 (__cxa_rethrow + 144)
9 libobjc.A.dylib 0x000001816c06e8 0x1816b8000 + 34536 (objc_exception_rethrow + 44)
10 рдХреЛрд░рдлрд╛рдЙрдВрдбреЗрд╢рди 0x0000000182072344 0x18206a000 + 33604 (CFRunLoopRunSpecific + 544)
11 рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рд░реНрд╡рд┐рд╕реЗрдЬ 0x0000000183f03f84 0x183ef9000 + 44932 (GSEventRunModal + 100)
12 UIKit 0x000000018b61e880 0x18b5ab000 + 473216 (UIApplicationMain + 208)

@torarnv рдирдорд╕реНрддреЗ, рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рд╕рдлрд▓ рдордЪ-рдУ-рд╣реБрдХ рдбреЗрдореЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЬрдм рдореИрдВ mach_hook __cxa_throw рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ EXC_BAD_ACCESS рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред

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

рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ?

рд╣рдордиреЗ @huakucha рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЧрддрд┐рд╢реАрд▓ рд╣реБрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдпрд╛ рд╣реИ: #375

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

chzhij5 picture chzhij5  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

1t2t3t4t picture 1t2t3t4t  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kstenerud picture kstenerud  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

happy201993 picture happy201993  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ferrous777 picture ferrous777  ┬╖  30рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ