рдирд┐рд░реНрджреЗрд╢ рд╡рд┐рд░рд╛рдо
[рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ , рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджрд┐рдпрд╛]
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ JIT рдХрдВрдкрд╛рдЗрд▓рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдЕрдВрджрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЛрдб рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ
int 3
рдирд┐рд░реНрджреЗрд╢ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдм рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╡реНрдпрд╡рдзрд╛рди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рдЬреЛ рдХрд┐ OS рдХрд╛ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдмрджрд▓реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд SIGTRAP рд╕рд┐рдЧреНрдирд▓ рдореЗрдВред рдирд┐: рд╢реБрд▓реНрдХ рддреИрд░рд╛рдХреА рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕
int 3
рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдкрд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧрд░ рдЗрд╕ рд╕рдВрдХреЗрдд рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдЧрд╛, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╡реИрд╕реЗ, рдбрд┐рдмрдЧрд░реНрд╕ рд╕реНрд╡рдпрдВ рднреА рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдмрд╕ рдЗрд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмреНрд░реЗрдХ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕реАрд▓рд┐рдП
int 3
рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ (
0xCC
) рдХреЗ рд╕рд╛рде рдПрдирдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреЛ рдирд╣реАрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо
0xCD imm8
int X
(
0xCD imm8
) рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдХреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рддрд░рд╣ - рдЕрдиреНрдпрдерд╛
int 3
рд╕рд┐рдВрдЧрд▓-рдмрд╛рдЗрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреБрджреЗрд╢ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рдореИрдиреБрдЕрд▓ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рддреБрдо рднреА рдЙрдирдХреЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд░ рдмрдВрдж рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдмрд╕ рдЙрдирдХреЗ рдкрджреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдФрд░ рдПрдХ рдЦрд╛рд▓реА
nop
(
0x90
) рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдмрджрд▓реЗрдВред
рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдорд╛рдорд▓рд╛ рд╣реИ - рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯред
рдкрд╣реБрдВрдЪ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд░рдирд┐рдВрдЧ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдореЗрдореЛрд░реА рдХрд░рдкреНрд╢рди рдХреЛ рдбрд┐рдмрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдвреЗрд░ рдХреЛ рд╕рдореЗрдЯрддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЛрдВ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рдлреЗрд░рдмрджрд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдо рд▓рдЧрднрдЧ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ рдХрд┐ рдХрд┐рд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд╕реНрддреБ рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбрд┐рдмрдЧрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рдкрд░ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдбрд╛рд▓рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬреАрд╕реА рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдиреЗ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдХрдЪрд░реЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ / рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕реНрд╡рднрд╛рд╡ рд╡рд╛рд▓реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдЗрдЪреНрдЫрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЙрдирдХреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
void SetAccessBreak(void* addr);
рдпрд╣рд╛рдВ, рдЕрдЪреНрдЫреЗ
dr0
рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд┐рдП рдЧрдП рдбрд┐рдмрдЧ рд░рдЬрд┐рд╕реНрдЯрд░
dr0
,
dr1
,
dr2
,
dr3
рдФрд░ рдЙрдирдХреЗ рдЪрд╛рдЪрд╛ рдЪреЗрд░реНрдиреЛрдореЛрд░
dr7
, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдЭрдВрдбреЗ рд╣реЛрддреЗ рд╣реИрдВред
рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ
dr0
-
dr3
рдЙрд╕ рдкрддреЗ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдореЙрдирд┐рдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░
dr7
рдЙрдкрдпреБрдХреНрдд рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдШрдЯрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ (рдирд┐рд╖реНрдкрд╛рджрд┐рдд / рдкрдврд╝реЗрдВ / рдкрдврд╝реЗрдВ рдпрд╛ рд▓рд┐рдЦрд┐рдП рдЗрд╕ рдкрддреЗ рдкрд░), рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ (1 рдмрд╛рдЗрдЯ, 2 рдмрд╛рдЗрдЯреНрд╕, 4 рдмрд╛рдЗрдЯреНрд╕, 8 рдмрд╛рдЗрдЯреНрд╕)ред рдзреНрд╡рдЬ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдореМрдЦрд┐рдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрд░ рд╕реНрдерд╛рди рдХреЛ рдмрд░реНрдмрд╛рдж рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреБрд░рдВрдд рджреЛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХреЛрдб рджреВрдВрдЧрд╛:
MakeFlags
, рдЬреЛ
dr7
рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рдбрд┐рдмрдЧ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░
MakeMask
, рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЭрдВрдбреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдирдХрд╛рдм рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд▓рд┐рдП (рдЕрдЧрд░ рд╣рдо рд╕рднреА рдЭрдВрдбреЗ рд╕рд╛рдл рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╕рдорд╛рди рдореБрдЦреМрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
enum DebugRegister { <br/>
kDR0 = 0 ,<br/>
kDR1 = 2 ,<br/>
kDR2 = 4 ,<br/>
kDR3 = 6 <br/>
} ; <br/>
<br/>
enum BreakState { <br/>
kDisabled = 0 , // disabled - 00 <br/>
kEnabledLocally = 1 , // task local - 01 <br/>
kEnabledGlobally = 2 , // global - 10 <br/>
kBreakStateMask = 3 // mask 11 <br/>
} ; <br/>
<br/>
enum Condition { <br/>
kWhenExecuted = 0 , // on execution - 00 <br/>
kWhenWritten = 1 , // on write - 01 <br/>
kWhenWrittenOrReaden = 3 , // on read or write - 11 <br/>
kConditionMask = 3 // mask 11 <br/>
} ; <br/>
<br/>
enum Size { <br/>
kByte = 0 , // 1 byte - 00 <br/>
kHalfWord = 1 , // 2 bytes - 01 <br/>
kWord = 3 , // 4 bytes - 11 <br/>
kDoubleWord = 2 , // 5 bytes - 10 <br/>
kSizeMask = 3 // mask 11 <br/>
} ; <br/>
<br/>
<br/>
uint32_t MakeFlags ( DebugRegister reg, BreakState state, Condition cond, Size size ) { <br/>
return ( state | cond << 16 | size << 24 ) << reg ; <br/>
} <br/>
<br/>
<br/>
uint32_t MakeMask ( DebugRegister reg ) { <br/>
return MakeFlags ( reg, kBreakStateMask, kConditionMask, kSizeMask ) ; <br/>
} <br/>
рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛ рдмрддрд╛рдП рдкрд╛рдиреА рдореЗрдВ рднрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд░рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рд╛рде
SetAccessBreak
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
bool SetAccessBreak ( void * addr,<br/>
DebugRegister reg,<br/>
Condition cond,<br/>
Size size ) { <br/>
const uint32_t control = MakeFlags ( reg, kEnabledLocally, cond, size ) ; <br/>
__asm__ ( "movl %0, %%dr0 \n " <br/>
"movl %1, %%dr7 \n " : : "r" ( addr ) , "r" ( control ) : ) ; <br/>
}
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕рд░рдд рд╣реИ: рдбреАрдмрдЧ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рд╕реБрд░рдХреНрд╖рд╛ рд░рд┐рдВрдЧ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдЕрд░реНрдерд╛рддред рдХреЛрд░ рд╕реЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ рдкреНрд▓рд╕-рдкреНрд▓рд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ (рдХреЛрдИ рднреА рдЖрдзреБрдирд┐рдХ рдбрд┐рдмрдЧрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдУрдПрд╕ рдЖрдорддреМрд░ рдкрд░ рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдкрд░, рдЖрдк рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ
thread_get_state
/
thread_set_state
рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ
SetAccessBreak
рд▓рд╛рдЧреВ
SetAccessBreak
:
bool SetAccessBreak ( pthread_t target_thread,<br/>
void * addr,<br/>
DebugRegister reg,<br/>
Condition cond,<br/>
Size size ) { <br/>
x86_debug_state dr ; <br/>
mach_msg_type_number_t dr_count = x86_DEBUG_STATE_COUNT ; <br/>
<br/>
// POSIX MACH . <br/>
mach_port_t target_mach_thread = pthread_mach_thread_np ( target_thread ) ; <br/>
<br/>
// . <br/>
kern_return_t rc = thread_get_state ( target_mach_thread,<br/>
x86_DEBUG_STATE,<br/>
reinterpret_cast < thread_state_t > ( & dr ) ,<br/>
& dr_count ) ; <br/>
<br/>
// <br/>
if ( rc ! = KERN_SUCCESS ) return false ; <br/>
<br/>
// , . <br/>
switch ( reg ) { <br/>
case kDR0 : dr. uds . ds32 .__dr0 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>
case kDR1 : dr. uds . ds32 .__dr1 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>
case kDR2 : dr. uds . ds32 .__dr2 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>
case kDR3 : dr. uds . ds32 .__dr3 = reinterpret_cast < unsigned int > ( addr ) ; break ; <br/>
} <br/>
<br/>
// . <br/>
dr. uds . ds32 .__dr7 & = ~MakeMask ( reg ) ; <br/>
<br/>
// . <br/>
dr. uds . ds32 .__dr7 | = MakeFlags ( reg, kEnabledLocally, cond, size ) ; <br/>
<br/>
// . <br/>
rc = thread_set_state ( target_mach_thread,<br/>
x86_DEBUG_STATE,<br/>
reinterpret_cast < thread_state_t > ( & dr ) ,<br/>
dr_count ) ; <br/>
<br/>
// . <br/>
if ( rc ! = KERN_SUCCESS ) return false ; <br/>
<br/>
// . <br/>
return true ; <br/>
}
рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм рдЕрдЪреНрдЫреЗ рдЕрд╢реБрджреНрдз рдЬреЗрдирд┐рдЯрд░-рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
static int16_t foo = 0 ; <br/>
static int32_t bar = 0 ; <br/>
<br/>
int main ( int argc, char * argv [ ] ) { <br/>
foo = 1 ; <br/>
bar = 1 ; <br/>
SetAccessBreak ( pthread_self ( ) , & bar, kDR0, kWhenWritten, kWord ) ; <br/>
foo = 2 ; <br/>
bar = 2 ; <br/>
SetAccessBreak ( pthread_self ( ) , & foo, kDR0, kWhenWritten, kHalfWord ) ; <br/>
foo = 3 ; <br/>
bar = 3 ; <br/>
return 0 ; <br/>
} <br/>
рдФрд░ рдбреАрдмрдЧрд░ рдХреЗ рдиреАрдЪреЗ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдмрд╛рдзрд┐рдд рд╣реИ - рдЕрд░реНрдерд╛рдд рд╕реНрдореГрддрд┐ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:
(gdb) r
Starting program: /Users/mraleph/test
Reading symbols for shared libraries +++. done
Program received signal SIGTRAP, Trace/breakpoint trap.
main (argc=1, argv=0xbffff9f8) at test.cc:107
106 bar = 2; <= triggered SIGTRAP -- mr.aleph
107 SetAccessBreak(pthread_self(), &foo, kDR0, kWhenWritten, kHalfWord);
(gdb) c
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
main (argc=1, argv=0xbffff9f8) at test.cc:109
108 foo = 3; <= triggered SIGTRAP -- mr.aleph
109 bar = 3;
(gdb) c
Continuing.
Program exited normally.