Java动态调试技术原理及实践


<李>

 <代码> []();
[]();
 <代码> []();
[] ();

本月是仪表类型的对象,是JVM自动传入的,我们可以拿这个参数进行类增强等操作。

<李>

“Premain-Class”或者“代理类”:

 <代码> Premain-Class: 
代理类:
<李>

 <代码>空白attachAgentToTargetJVM()抛出{
& lt; VirtualMachineDescriptor>virtualMachineDescriptors=VirtualMachine。();
VirtualMachineDescriptor targetVM=,
(VirtualMachineDescriptor描述符:virtualMachineDescriptors) {
(descriptor.id () .equals (configure.getPid ())) {
targetVM=描述符;
,
}
}
(targetVM==) {
IllegalArgumentException (+ configure.getPid ());
}
VirtualMachine VirtualMachine=,
{
VirtualMachine=VirtualMachine.attach (targetVM);
VirtualMachine。loadAgent (,),
} (e) {
(virtualMachine !=) {
virtualMachine.detach ();
}
}
}

 <代码> 
(match_option(选项,,,尾巴)| |
(is_absolute_path=match_option(选项,,,尾巴))){
(尾巴!=){
* pos=(尾巴);
len=(pos==) ?(尾):pos -尾巴;
*名称=(NEW_C_HEAP_ARRAY (len + mtArguments),尾巴,len);
[len]=名称;
*选项=,
(pos !=){=操作系统:
选择:strdup_check_oom (pos +, mtArguments);
}
! INCLUDE_JVMTI
(valid_jdwp_agent(名称、is_absolute_path)) {
jio_fprintf (defaultStream: error_stream (),
);
JNI_ERR;
}

add_init_agent(名称、选择is_absolute_path);
}

} (match_option(选项,,,尾巴)){
# ! INCLUDE_JVMTI
jio_fprintf (defaultStream: error_stream (),
);
JNI_ERR;

(尾巴!=){
长度=(尾巴)+;
*选项=NEW_C_HEAP_ARRAY(、长度、mtArguments);
jio_snprintf(选项、长度、尾);
add_init_agent(选项);

(!create_numbered_property (, addmods_count + +)) {
JNI_ENOMEM;
}
}

}

<强> <强>

 <代码> 
AgentLibraryList _agentList;
*, *选项,
{_agentList absolute_path)。add (AgentLibrary(名称、选项、absolute_path));}

add_init_agent函数将解析好的,需要加载的代理添加到这个链表中,等待后续的处理。

 <代码> 
(参数::init_agents_at_startup ()) {
create_vm_init_agents ();
}
{
! _agentList.is_empty ();
}

 <代码>空白线程::create_vm_init_agents () {
AgentLibrary *代理;
(代理=参数::代理();代理!=;代理=代理→next ()) {
比如(创建了JPLISAgent之后,调用initializeJPLISAgent对这个代理进行初始化操作。跟进initializeJPLISAgent看一下是如何初始化的:

 <代码> {

checkCapabilities(代理);

jvmtierror=(* jvmtienv)→GetPhase (jvmtienv,及阶段);

<李>

<李>

 <代码> AttachOperationFunctionInfo func []={
get_agent_properties}, {
data_dump}, {
dump_heap}, {
load_agent}, {
get_system_properties}, {
thread_dump}, {
heap_inspection}, {
set_flag}, {
print_flag}, {
jcmd}, {
{,}
};

 <代码> LinuxAttachOperation * LinuxAttachListener::出列(){
(,) {

,
len=(addr);
可重新开始的(::接受(侦听器(),和addr,和兰),s);

<强>

 <代码> AttachListener:: is_init_trigger () {
(init_at_startup () | | is_initialized ()) {
;null

Java动态调试技术原理及实践