рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рд╣рдордиреЗ рдХрдВрдкрдиреА рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╣рдорд╛рд░реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ рд╣реБрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдБ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЬрд▓реНрджреА рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЙрд▓ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреИрдХ рдХреЗ рдмреИрдХрдЯреНрд░реЗрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдереАред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ C / C ++ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП backtracking рдФрд░ Linux рдФрд░ FreeBSD рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдкрд░ рдореЗрд░реЗ рд╢реЛрдз рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯреИрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддрдерд╛рдХрдерд┐рдд
рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдмрдирд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХрд╛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдлреНрд░реЗрдо рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ, рд╡рд╛рдкрд╕реА рдкрддрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЕрд░реНрдерд╛рддред рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрддрд╛, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд╣ рд╕рдм рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдлрд╝реНрд░реЗрдо рдХреА рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдФрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП am64):
void * GetReturnAddress(int depth) { void *res; asm ( "mov %1, %%rcx\n" "MOVE: mov 0x0(%%rbp), %%rax\n" "loop MOVE\n" "mov 0x8(%%rax), %rax\n" "mov %%rax, %0\n" : "=m" (res) : "g" (depth) : "rax", "rcx"); return res; }
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдФрд░ рднреА рдЫреЛрдЯрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рд░рдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд░реЗрд╕ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди, рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рд╣реЛрдирд╛ рдЬреЗрдбреА рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ рдореИрдВ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред
Gcc рдПрдХреНрд╕рдЯреЗрдВрд╢рди
рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдЖрдИ, рд╡рд╣ рдереА
__builtin_return_address рдлрдВрдХреНрд╢рди рдХреГрдкрдпрд╛ рд╣рдореЗрдВ gcc рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИред рдЙрд╕рдХрд╛
рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рд╣реИ:
рд╢реВрдиреНрдп * __builtin_return_address (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int рд╕реНрддрд░) - рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкрддрд╛ рджреЗрддрд╛ рд╣реИред
рд╕реНрддрд░ = 0 рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ
рд╕реНрддрд░ = 1 рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛рдПрдЧрд╛, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкрддрд╛ рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрджрд┐ред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ: рдЬрдм рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ (рдЖрдЧреЗ рд╣рдо рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ) рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╡реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЪрд░ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реБрдВрджрд░ рджреГрд╢реНрдп рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдмрдЬрд╛рдп:
рд╡рд╛рдкрд╕реА __builtin_return_address (i);рдореБрдЭреЗ рдмрджрд╕реВрд░рдд рд▓рд┐рдЦрдирд╛ рд╣реИ:
switch(level) { case 0: return __builtin_return_address(1); case 1: return __builtin_return_address(2); тАж. }
рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдЖрдЧреЗ рдмрдврд╝реЛред
рдкрд╢реНрд╡-рдЕрдиреБрд░реЗрдЦрди
рд▓рд┐рдирдХреНрд╕ рдореЗрдВ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред FreeBSD рдореЗрдВ, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП libexecinfo рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рд╡реЗ рд╣реИрдВ:
int рдмреИрдХрдЯреНрд░реЗрд╕ (рд╢реВрдиреНрдп ** рдмрдлрд░, рдЗрдВрдЯ рдЖрдХрд╛рд░) - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмреИрдХрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдмрдлрд░ рдХреЛ рднрд░рддрд╛ рд╣реИред
char ** backtrace_symbols (рд╢реВрдиреНрдп * const * рдмрдлрд░, int рдЖрдХрд╛рд░) - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкрд╛рда рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрддреЗ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред
void backtrace_symbols_fd (void * const * рдмрдлрд░, int size, int fd) - рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓
рдореИрд▓реЛрдбреЙрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп
рдпрд╣ рд╕реАрдзреЗ рдлрд╛рдЗрд▓ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддрд╛ рд╣реИред
рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП,
backtrace_symbols рдПрдХ рдкрдВрдХреНрддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
./prog(_Z6myfunci+0x1a) [0x8048840]
рдЬрд╣рд╛рдБ: рдкреНрд░реЙрди рдмрд╛рдЗрдирд░реА рдХрд╛ рдирд╛рдо рд╣реИ
_Z6myfunci - рдХреЛрдбрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо
0x1a - рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдСрдлрд╕реЗрдЯ
0x8048840 - рдлрд╝рдВрдХреНрд╢рди рдкрддрд╛
рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг,
рдореИрди рдмреИрдХрдЯреНрд░реЗрд╕ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐
backtrace_symbols рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ
рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ
-rdynamic рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ backtrace_symbols рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд▓реА рдЧрдИ рд╣реИред рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рд╡рд╣рд╛рдВ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЬрдмрд░рди рдЬреЛрдбрд╝ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдХреБрдВрдЬреА рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
dladdr
Backtrace_symbols рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╛рда рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдпрджрд┐ рд╣рдо рдХреЛрдИ рдЬреЛрдбрд╝ рддреЛрдбрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рд╕реЗ рдЬреЗрдбреА рдирд╣реАрдВ! рдпрд╣ рдХреНрдпреЛрдВ рдЬрд░реВрд░реА рд╣реИ рдпрд╣ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдБ
рдбрд▓рдбреНрд░рд░ рдлрдВрдХреНрд╢рди
рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓ рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рднреАрддрд░
backtrace_symbols рдХрд╣рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдореЗрдВ
Dl_fofo рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛
рдорд┐рд▓рддреА рд╣реИ :
int dladdr (void * addr, Dl_info * рдЬрд╛рдирдХрд╛рд░реА);Dladdr рдХреЙрд▓ рдХреЗ рд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
backtrace_symbols рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╣реЛрдВрдЧреЗред
рдЦреИрд░, рд▓рдЧрднрдЧ рдареАрдХ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрддреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рднреА рд╣реИрдВ, рдпрджреНрдпрдкрд┐ рдЗрдирдХреЛрдбреЗрдб рдкреНрд░рд╛рд░реВрдк рдореЗрдВ (рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ)ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЬрд╛рдирдХрд╛рд░реА рдЕрднреА рднреА рдмрд╛рд╣рд░ рдЦреАрдВрдЪреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╢рд╛рдпрдж рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрд╕ рдкрдВрдХреНрддрд┐ рдХрд╛ рдкрддрд╛ рднреА рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рдд рд╣реИ? рджрд░рдЕрд╕рд▓, рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рднреНрд░рдорд┐рдд рд╣реЛрдирд╛ рдкрдбрд╝реЗ!
рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд▓реЗрдирд╛-рджреЗрдирд╛!
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдбреЗрдЯрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрдХ рдкрддрд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓рд╛рдЗрди рдирдВрдмрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ gdb рдбреАрдмрдЧрд░ рдХреА рд╕реВрдЪреА рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рдмрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдПрдХ рд╣реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рддреЛ рд╕реВрдЪреА * <рдкрддрд╛> рдЖрдкрдХреЛ рд▓рд╛рдЗрди рдирдВрдмрд░ рджрд┐рдЦрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╛рд╕ рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рднреА рд╣реИрдВ, рддреЛ рдЖрдк "рдУрд╣ рдЪрдорддреНрдХрд╛рд░!" рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдбрд┐рдмрдЧ рдХреЗ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрджрд░реНрд╢ рдХреЗ рд▓рд┐рдП рдЬреЗрдбреА рдЖрдХрд╛рдВрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдЯреНрд░рд┐рдк рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рдирд┐рдХрд▓рд╛:
- рд╣рдо рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдбрд┐рдмрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (-g рд╕реНрд╡рд┐рдЪ рдпрд╛, рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП, -g3 - рдлрд┐рд░ рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдбреАрдмрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
- Objcopy --only-keep-debug a.out a.out.sym рдЪрд▓рд╛рдПрдВ ред рдЕрдм gdb рдореЗрдВ рдЖрд░рд╛рдорджрд╛рдпрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА a.out.sym рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред
- рд╣рдо рд╕реНрдЯреНрд░рд┐рдк a.out рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рдиреА рдбреАрдмрдЧ a.out рд╕реЗ рдирд┐рдХрд╛рд▓реЗрдВред
рдЕрдм рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рд╣рдорд╛рд░реЗ a.out.sym рдХреЛ ajout рдХреЗ рд╕рд╛рде objcopy рдХрдорд╛рдВрдб --add-gnu-debuglink = a.out.sym a.out рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗрдВ ред рддрдм рдбрд┐рдмрдЧрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ a.out.sym рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд▓реЛрдб рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдЗрдирд░реА рд╕реНрдерд┐рдд рд╣реИред
- рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ a.out.sym рдлрд╝рд╛рдЗрд▓ рдХреЛ gdb рд╕реЗ рдкреНрд░рддреАрдХ-рдлрд╝рд╛рдЗрд▓ a.out.sym рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рд╣рдХ рдХреЛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрд╣ рдХрд░реБрдгрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдбрд┐рдмрдЧ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд░рд╛рд╢рд┐ рд╣реИ), рдпрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ (рд╣рдо рд╣реИрдХрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдХреБрдЫ рд╕рд╣реА рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рдЗрд╕реЗ рдХрдИ рдЧрд╛рдпрдм .sym рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рднрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рди рдХреЗрд╡рд▓ рд▓рд╛рдЗрди рдирдВрдмрд░, рдмрд▓реНрдХрд┐ рд╕реЛрд░реНрд╕ рдХреЛрдб рднреА рджреЗрдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ (рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рдЗрдЪреНрдЫрд╛) рдкрд░ рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк gdbserver рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:
- рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рддрд░рдл, gdbserver 127.0.0.1:2345 a.out рдЪрд▓рд╛рдПрдВ
- рдФрд░ рд╣рдорд╛рд░реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, gdb рдЪрд▓рд╛рдПрдВ рдФрд░ рдХрдорд╛рдВрдб рд▓рдХреНрд╖реНрдп рд░рд┐рдореЛрдЯ рдХреЛ 127.0.0.1:2345 рдЪрд▓рд╛рдПрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдиреНрд╣реАрдВ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрд▓рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдереЗред
рдкреНрд░рдмрдВрдз рдХрд░рдирд╛ / рдЧрд┐рд░рд╛рдирд╛
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдХрд╣реВрдВрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдирд╛рдордХрд░рдг рдЯрдХрд░рд╛рд╡ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рд╡рд┐рд░реВрдкрдг рд▓рд┐рдВрдХрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╛ рдЖрд╕рд╛рди рднреА рд╣реИ, рдЕрдЧрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВ рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдкреИрд░рд╛рдореАрдЯрд░ (рдЕрддрд┐рднрд╛рд░рд┐рдд), рддреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЛ рдПрдирдХреЛрдб рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдЕрдиреВрдард╛ рдирд╛рдо рдмрддрд╛рддрд╛ рд╣реИред рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ
рдореИрдирд▓рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░рд┐рд╡рд░реНрд╕
рдбреЗрдореЛрдВрдЧреНрд▓рд┐рдВрдЧ рд╣реИ ред
рдПрдиреНрдХреЛрдбреЗрдб рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХреЛ рдореВрд▓ рд╕реНрд╡рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдлрд┐рд░ рд╕реЗ gcc-extension рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
char * abi :: __ cxa_demangle (const char * mangled_name, char * output_buffer, size_t * length, int * status)рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рдПрдиреНрдХреЛрдбреЗрдб рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдмрдлрд░ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реБрдП рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдирд╛рдо рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдФрд░ рдЕрдВрдд рдореЗрдВ
рд╕рд╣реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдордЬреЗрджрд╛рд░ рддрд░реАрдХрд╛ рд╕рд┐рд░реНрдл рдЬреАрдбреАрдмреА рдкреВрдЫрдирд╛ рдерд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ )ред
void print_trace() { char pid_buf[30]; sprintf(pid_buf, "%d", getpid()); char name_buf[512]; name_buf[readlink("/proc/self/exe", name_buf, 511)]=0; int child_pid = fork(); if (!child_pid) { dup2(2,1);
рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рд┐рдВрдЯ_рдЯреНрд░реЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡реЙрдЗрд▓рд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рдЯреВ рд╕реНрдЯрдбрдЖрдЙрдЯ рд╣реЛрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ рдФрд░ рдЬреАрдбреАрдмреА рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╡рд╣ рд╕рдм рд╣реИред
рдПрдХ рдЕрдЪреНрдЫрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╣реИ!