JDI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдмрдЧрд┐рдВрдЧ

рдкрд░рд┐рдЪрдп

рдЬрдм рдЧреНрд░рд╣рдг рдореЗрдВ рдбрд┐рдмрдЧрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЗрд╡реАрдПрдо рдкрд░ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдерд╛ рдХрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рддрдХ рдХрд┐рддрдиреА рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╕реНрдЯреНрд░реАрдо, рд╡реИрд░рд┐рдПрдмрд▓ рдорд╛рди рдЖрджрд┐ред рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╕рдордп-рд╕рдордп рдкрд░ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ "рд╕реНрдХреНрд░рд┐рдкреНрдЯ" рдХрд░рдиреЗ рдпрд╛ рдЙрди рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереАред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрднреА-рдХрднреА рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реБрдП рдЪрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ "рдореЙрдирд┐рдЯрд░" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд╢рд░реНрдд рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб "System.out.println (рдЕрдпреЛрдЧреНрдп)" рдЬреИрд╕рд╛ рдерд╛; рдЭреВрдареЗ рд▓реМрдЯреЛ тАЭред рдЗрд╕ рд╣реИрдХ рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд▓рдЧрднрдЧ рдЪрд░ рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд▓реЙрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛ (рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЕрднреА рднреА рд╢рд░реНрдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд┐рдд рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдФрд░ рдирд╣реАрдВ)ред рд╕рд╛рде рд╣реА, рдЕрдХреНрд╕рд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╡реНрдпреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдкрд░, рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рдерд╛ рдХрд┐ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдХреЛрдб рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдХреЗ рдареАрдХ рдмрд╛рдж рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рд╡рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреАрди рд╢реЗрд▓ рдпрд╛ рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдЖрдЦрд┐рд░рдХрд╛рд░, рдЧреНрд░рд╣рдг рд╕реНрд╡рдпрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдХреБрдЫ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЬреЗрд╡реАрдПрдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдФрд░ рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВред


JPDA рдФрд░ JDI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЬреЗрд╡реАрдПрдо рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЗрдкреАрдбреАрдП - рдЬрд╛рд╡рд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдбреАрдмрдЧрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╢рдмреНрдж рдХреЗ рддрд╣рдд рдПрдХ рд╕рд╛рде рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдирдореЗрдВ рдЬреЗрд╡реАрдПрдордЯреАрдЖрдИ рд╢рд╛рдорд┐рд▓ рд╣реИ - рдЬреЗрд╡реАрдПрдо рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬрд┐рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди, рдЬреЗрдбреАрдбрдмреНрд▓реНрдпреВрдкреА - рдбреАрдмрдЧрд░ рдФрд░ рдЬреЗрд╡реАрдПрдо рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреАрдмрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрджрд┐ред

рдпрд╣ рд╕рдм рдмрд╣реБрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдм рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд JDI JPDA - Java рдбреАрдмрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдЬреЗрд╡реАрдПрдо рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдПрдкреАрдЖрдИ рд╣реИ - рдбреЙрдХреНрдЯрд░ рдиреЗ рдЬреЛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдерд╛ред рдЬреЗрдкреАрдбреАрдП рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреЗрдЬ рдиреЗ рд╕рди / рдУрд░реЗрдХрд▓ рд╕реЗ рд╕рдВрджрд░реНрдн рдЬреЗрдбреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИред рддреЛ, рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛

рдЙрджрд╛рд╣рд░рдг

рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рджреЛ Groovy Shells рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ - рдПрдХ рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ "рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ" рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдбреАрдмрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╢реЗрд▓ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп "рдбреАрдмрдЧрд░" рд╢реЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред

рд╡рд┐рд╖рдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7896
рдпрд╛рдиреА рдЬреЗрд╡реАрдПрдо рдХреЛ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд░рд╕реНрде рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкреЛрд░реНрдЯ 7896 рдкрд░ рдбреАрдмрдЧрд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрджреЗрд╢ рдХреЛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдореЗрдВ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
 myVar = тАЬSome special valueтАЭ; 

рддрджрдиреБрд╕рд╛рд░, рдореВрд▓реНрдп "рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп" рдбреАрдмрдЧрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдЗрдВрдЯрд░реНрдирд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рд╕реНрд░реЛрдд рдкрд░ рдХрдо рд╕реЗ рдХрдо рдЭрд╛рдВрдХрдирд╛), рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдореБрдЭреЗ рдЕрдзрд┐рдХ рд░реЛрдЪрдХ рдФрд░ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд▓рдЧ рд░рд╣рд╛ рдерд╛ред

рддрдм рдпрд╣ "рдбрд┐рдмрдЧрд░" рддрдХ рдерд╛:

рдЪрд▓реЛ рдХрджрдо рд╕реЗ рдХрджрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдЬреЗрд╡реАрдПрдо рдХрдиреЗрдХреНрд╢рди

JDI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЙрд╕ JVM рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ (host == localhost рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдПрдХ рд╣реА рдорд╢реАрди рдкрд░ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд░рд┐рдореЛрдЯ рдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдкреЛрд░реНрдЯ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ "рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ" JVM рдХреЗ рдбрд┐рдмрдЧ-рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдПрдХ рд╕реЗрдЯ рд╣реИ)ред
JDI рдЖрдкрдХреЛ JVM рдореЗрдВ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рд╕реАрдзреЗ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, VirtualMachineManager рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ AttachingConnector рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╣рдо рдкрд░рд┐рд╡рд╣рди рдХреЗ рдирд╛рдо рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рдХрдиреЗрдХреНрдЯрд░ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ ("dt_socket")
 vmm = com.sun.jdi.Bootstrap.virtualMachineManager(); vmm.attachingConnectors().each{ if("dt_socket".equalsIgnoreCase(it.transport().name())) { atconn = it; } } args = atconn.defaultArguments(); args.get("port").setValue(7896); args.get("hostname").setValue("127.0.0.1"); vm = atconn.attach(args); 


рдореБрдЦреНрдп рдХрд╛ рд╕реНрдЯреНрд░реАрдо рдЯреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд░рд┐рдореЛрдЯ рдЬреЗрд╡реАрдПрдо рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреЛ рджреЗрдЦрдиреЗ, рдЙрдиреНрд╣реЗрдВ рд░реЛрдХрдиреЗ, рдЖрджрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рджреВрд░рд╕реНрде рдЬреЗрд╡реАрдПрдо рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдареАрдХ рд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред JDI javadoc рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ:
"рд╡рд┐рдзрд┐ рдЖрд╣реНрд╡рд╛рди рддрднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдзрд╛рдЧрд╛ рдХреЛ рдЙрд╕ рдереНрд░реЗрдб рдореЗрдВ рд╣реБрдИ рдХрд┐рд╕реА рдШрдЯрдирд╛ рд╕реЗ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдЬрдм VM VM рдХреЛ VirtualMachine.suspend () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЬрдм ThreadReference.suspend () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдереНрд░реЗрдб рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╡рд┐рдзрд┐ рдордВрдЧрд▓рд╛рдЪрд░рдг рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдЧрдпрд╛ - рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдореЗрдВ рди рджреЗрдЦреЗрдВ рд▓реЗрдХрд┐рди рдЕрднреА рдЬреЛ рдЬреЗрд╡реАрдПрдо рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рджреЗрдЦреЗрдВ рдФрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рд╕рд╣реА рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред

рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ JVM рдХреЗ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ, рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рдерд╛, рдФрд░ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕реНрдЯрд╛рд░реНрдЯ рдЯреНрд░реИрдХ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рдзрд╛рд░рд╛ рдХреЛ рдкрд╣рд▓реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рддрд╛рдХрд┐ рдмрд╛рдж рдХреЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рджреМрд░рд╛рди рдХреАрдкреНрд░реЗрд╕ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрдиреА рд░рд╣реЗред
 // Find thread by name "main" vm.allThreads().each{ if(it.name().equals("main")) mainThread = it } // Suspend it mainThread.suspend() // Look what's in it's stack trace i=0; mainThread.frames().each{ println String.valueOf(i++)+": "+it; }; println ""; 


рдирддреАрдЬрддрди, рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рд╛:
 0: java.io.FileInputStream.readBytes(byte[], int, int)+-1 in thread instance of java.lang.Thread(name='main', id=1) 1: java.io.FileInputStream:220 in thread instance of java.lang.Thread(name='main', id=1) 2: java.io.BufferedInputStream:218 in thread instance of java.lang.Thread(name='main', id=1) 3: java.io.BufferedInputStream:237 in thread instance of java.lang.Thread(name='main', id=1) 4: jline.Terminal:99 in thread instance of java.lang.Thread(name='main', id=1) 5: jline.UnixTerminal:128 in thread instance of java.lang.Thread(name='main', id=1) 6: jline.ConsoleReader:1453 in thread instance of java.lang.Thread(name='main', id=1) 7: jline.ConsoleReader:654 in thread instance of java.lang.Thread(name='main', id=1) 8: jline.ConsoleReader:494 in thread instance of java.lang.Thread(name='main', id=1) 9: jline.ConsoleReader:448 in thread instance of java.lang.Thread(name='main', id=1) 10: jline.ConsoleReader$readLine.call(java.lang.Object, java.lang.Object)+17 in thread instance of java.lang.Thread(name='main', id=1) 11: org.codehaus.groovy.tools.shell.InteractiveShellRunner:89 in thread instance of java.lang.Thread(name='main', id=1) 12: org.codehaus.groovy.tools.shell.ShellRunner:75 in thread instance of java.lang.Thread(name='main', id=1) 13: org.codehaus.groovy.tools.shell.InteractiveShellRunner.super$2$work()+1 in thread instance of java.lang.Thread(name='main', id=1) ....  .., 65   


рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдирд╛

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдХреА рдПрдХ рд╕реНрдЯреЙрдкреНрд░реЗрд╕ рд╕реНрдЯреНрд░реАрдо рд╣реИред JDI API рддрдерд╛рдХрдерд┐рдд StackFrames рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдирдХрд╛ рд╕реНрдерд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ, рдореИрдВрдиреЗ "jline.ConsoleReader $ readLine.call" рд╕реЗ рд╕реНрдерд╛рди рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЖрдЧреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛:
 evReqMan = vm.eventRequestManager(); frame = mainThread.frames().get(10); bpReq = evReqMan.createBreakpointRequest(frame.location()); mainThread.resume(); bpReq.enable(); 


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

рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

JDI рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ StackFrame рд╕реЗ рдЙрдирдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рд╕рдВрджрд░реНрдн рд╕реЗ рдПрдХ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдВрдХ рдХреЛ рд╢реЗрд▓ рдореЗрдВ рд╣реА рдлреИрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░ рд╡рд╣ рдХрд╣рд╛рдБ рд╣реИ?

рд╣рдо рд╕рднреА рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕рднреА рджреГрд╢реНрдпрдорд╛рди рдЪрд░ рдкрд░ рдЬрд╛рд╕реВрд╕реА рдХрд░рддреЗ рд╣реИрдВ:
 i=0; mainThread.frames().each{ println String.valueOf(i++)+": "+it; try{ it.visibleVariables().each{var-> println " - "+var; }} catch(Exception e) {} }; println; 


рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ "org.codehaus.groovy.tools.shell.Main" рд╢реЗрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рд╕рд╛рде:
"48: org.codehaus.groovy.tools.shell.Main: 131 рдереНрд░реЗрдб рдореЗрдВ java.lang.Thread (рдирд╛рдо = 'рдореБрдЦреНрдп', рдЖрдИрдбреА = 1)ред"

рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рд╕реЗ рдЦреЛрдЬреЗ рдЧрдП рдореВрд▓реНрдп рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

Shell.Main рдХреЗ рдкрд╛рд╕ рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИред рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдЗрдВрдЯрд░реНрдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬрд╛рдирддреЗ рд╣реБрдП, рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдЧреНрд░реВрд╡реАрд╢реЗрд▓ рд╕рдВрджрд░реНрдн рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реИрдВ groovy.lang.Binding , рдЬреЛ рдХрд┐ рдЗрдВрдЯрд░рдкреЗрдВрдЯрд░ рдкрд░ getContext () рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ groovy.lang.Bang рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рд╣реИред рджреБрднрд╛рд╖рд┐рдпрд╛ рдирдВ)ред

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗ, рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рди getVariable (рд╕реНрдЯреНрд░рд┐рдВрдЧ varName) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

 frame = mainThread.frames().get(48); vShell = frame.getValue(frame.visibleVariableByName("shell")); vInterp = vShell.getValue(vShell.referenceType().fieldByName("interp")); vContext = vInterp.invokeMethod(mainThread, vInterp.referenceType().methodsByName("getContext").get(0), [], 0) varVal = vContext.invokeMethod(mainThread, vContext.referenceType().methodsByName("getVariable").get(0), [vm.mirrorOf("myVar")], 0) 


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдиреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп "рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп" рд▓реМрдЯрд╛рдпрд╛ - рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢

рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдбрд┐рдмрдЧрд░ рд╕реЗ рдЗрд╕ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рднреА рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рд╕реЗрдЯрд░реНрд╡рд┐рдПрдмрд▓ рд╡рд┐рдзрд┐ (рд╕реНрдЯреНрд░рд┐рдВрдЧ varName, рдСрдмреНрдЬреЗрдХреНрдЯ varValue) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред рдХреНрдпрд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
 varVal = vContext.invokeMethod(mainThread, vContext.referenceType().methodsByName("setVariable").get(0), [vm.mirrorOf("myVar"), vm.mirrorOf("Surprise!")], 0); bpReq.disable(); mainThread.resume(); 

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рднреА рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд▓рдВрдмрд┐рдд рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдХреЛ рд╡рд╛рдкрд╕ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЧреНрд░реВрд╡реА рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЦрд┐рд░реА рдмрд╛рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░, рдореИрдВрдиреЗ рдЪрд░ myVar рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХреА, рдФрд░ рдпрд╣ "рдЖрд╢реНрдЪрд░реНрдп!" рдирд┐рдХрд▓рд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖

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

рдпреБрдкреАрдбреА:
рдЧреНрд░реВрд╡реА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрд▓рд╛рдЗрди рдФрд░ рдЕрд╡рд░ рдЖрд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдП рдЧрдП: youdebug.kenai.com
рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓реЗрдЦрди рд╢реБрд░реВ рдХрд┐рдпрд╛ - github.com/mvmn/groovyjdi

Source: https://habr.com/ru/post/In155505/


All Articles