提交 6cb561ef 编写于 作者: M minqi

8000973: SA on windows thread inspection is broken

Summary: After bug 7161732, On Windows SA could not find correct address of thread_id of OSThread since _thread_id moved to end of the class . The presupposition of the address is following thread handle no longer stands. Fix by adding thread_id field to OSThread and getting the  address directly from OSThread.
Reviewed-by: nloodin, sspitsyn
Contributed-by: yumin.qi@oracle.com
上级 a3031899
/* /*
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -34,20 +34,10 @@ class WindbgAMD64Thread implements ThreadProxy { ...@@ -34,20 +34,10 @@ class WindbgAMD64Thread implements ThreadProxy {
private boolean gotID; private boolean gotID;
private long id; private long id;
/** The address argument must be the address of the HANDLE of the // The address argument must be the address of the OSThread::_thread_id
desired thread in the target process. */
WindbgAMD64Thread(WindbgDebugger debugger, Address addr) { WindbgAMD64Thread(WindbgDebugger debugger, Address addr) {
this.debugger = debugger; this.debugger = debugger;
// FIXME: size of data fetched here should be configurable. this.sysId = (long)addr.getCIntegerAt(0, 4, true);
// However, making it so would produce a dependency on the "types"
// package from the debugger package, which is not desired.
// another hack here is that we use sys thread id instead of handle.
// windbg can't get details based on handles it seems.
// I assume that osThread_win32 thread struct has _thread_id (which
// sys thread id) just after handle field.
this.sysId = (int) addr.addOffsetTo(debugger.getAddressSize()).getCIntegerAt(0, 4, true);
gotID = false; gotID = false;
} }
......
/* /*
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -34,20 +34,10 @@ class WindbgX86Thread implements ThreadProxy { ...@@ -34,20 +34,10 @@ class WindbgX86Thread implements ThreadProxy {
private boolean gotID; private boolean gotID;
private long id; private long id;
/** The address argument must be the address of the HANDLE of the // The address argument must be the address of OSThread::_thread_id
desired thread in the target process. */
WindbgX86Thread(WindbgDebugger debugger, Address addr) { WindbgX86Thread(WindbgDebugger debugger, Address addr) {
this.debugger = debugger; this.debugger = debugger;
// FIXME: size of data fetched here should be configurable. this.sysId = (long)addr.getCIntegerAt(0, 4, true);
// However, making it so would produce a dependency on the "types"
// package from the debugger package, which is not desired.
// another hack here is that we use sys thread id instead of handle.
// windbg can't get details based on handles it seems.
// I assume that osThread_win32 thread struct has _thread_id (which
// sys thread id) just after handle field.
this.sysId = (int) addr.addOffsetTo(debugger.getAddressSize()).getCIntegerAt(0, 4, true);
gotID = false; gotID = false;
} }
......
/* /*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,6 +32,7 @@ import sun.jvm.hotspot.types.*; ...@@ -32,6 +32,7 @@ import sun.jvm.hotspot.types.*;
// to the sys_thread_t structure of the classic JVM implementation. // to the sys_thread_t structure of the classic JVM implementation.
public class OSThread extends VMObject { public class OSThread extends VMObject {
private static JIntField interruptedField; private static JIntField interruptedField;
private static JIntField threadIdField;
static { static {
VM.registerVMInitializedObserver(new Observer() { VM.registerVMInitializedObserver(new Observer() {
public void update(Observable o, Object data) { public void update(Observable o, Object data) {
...@@ -43,6 +44,7 @@ public class OSThread extends VMObject { ...@@ -43,6 +44,7 @@ public class OSThread extends VMObject {
private static synchronized void initialize(TypeDataBase db) { private static synchronized void initialize(TypeDataBase db) {
Type type = db.lookupType("OSThread"); Type type = db.lookupType("OSThread");
interruptedField = type.getJIntField("_interrupted"); interruptedField = type.getJIntField("_interrupted");
threadIdField = type.getJIntField("_thread_id");
} }
public OSThread(Address addr) { public OSThread(Address addr) {
...@@ -52,4 +54,9 @@ public class OSThread extends VMObject { ...@@ -52,4 +54,9 @@ public class OSThread extends VMObject {
public boolean interrupted() { public boolean interrupted() {
return ((int)interruptedField.getValue(addr)) != 0; return ((int)interruptedField.getValue(addr)) != 0;
} }
public int threadId() {
return (int)threadIdField.getValue(addr);
}
} }
/* /*
* Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -43,7 +43,7 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess { ...@@ -43,7 +43,7 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess {
private static AddressField osThreadField; private static AddressField osThreadField;
// Field from OSThread // Field from OSThread
private static Field osThreadThreadHandleField; private static Field osThreadThreadIdField;
// This is currently unneeded but is being kept in case we change // This is currently unneeded but is being kept in case we change
// the currentFrameGuess algorithm // the currentFrameGuess algorithm
...@@ -64,7 +64,7 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess { ...@@ -64,7 +64,7 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess {
osThreadField = type.getAddressField("_osthread"); osThreadField = type.getAddressField("_osthread");
type = db.lookupType("OSThread"); type = db.lookupType("OSThread");
osThreadThreadHandleField = type.getField("_thread_handle"); osThreadThreadIdField = type.getField("_thread_id");
} }
public Address getLastJavaFP(Address addr) { public Address getLastJavaFP(Address addr) {
...@@ -128,10 +128,10 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess { ...@@ -128,10 +128,10 @@ public class Win32AMD64JavaThreadPDAccess implements JavaThreadPDAccess {
// Fetch the OSThread (for now and for simplicity, not making a // Fetch the OSThread (for now and for simplicity, not making a
// separate "OSThread" class in this package) // separate "OSThread" class in this package)
Address osThreadAddr = osThreadField.getValue(addr); Address osThreadAddr = osThreadField.getValue(addr);
// Get the address of the HANDLE within the OSThread // Get the address of the thread_id within the OSThread
Address threadHandleAddr = Address threadIdAddr =
osThreadAddr.addOffsetTo(osThreadThreadHandleField.getOffset()); osThreadAddr.addOffsetTo(osThreadThreadIdField.getOffset());
JVMDebugger debugger = VM.getVM().getDebugger(); JVMDebugger debugger = VM.getVM().getDebugger();
return debugger.getThreadForIdentifierAddress(threadHandleAddr); return debugger.getThreadForIdentifierAddress(threadIdAddr);
} }
} }
/* /*
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -42,7 +42,7 @@ public class Win32X86JavaThreadPDAccess implements JavaThreadPDAccess { ...@@ -42,7 +42,7 @@ public class Win32X86JavaThreadPDAccess implements JavaThreadPDAccess {
private static AddressField osThreadField; private static AddressField osThreadField;
// Field from OSThread // Field from OSThread
private static Field osThreadThreadHandleField; private static Field osThreadThreadIdField;
// This is currently unneeded but is being kept in case we change // This is currently unneeded but is being kept in case we change
// the currentFrameGuess algorithm // the currentFrameGuess algorithm
...@@ -63,7 +63,7 @@ public class Win32X86JavaThreadPDAccess implements JavaThreadPDAccess { ...@@ -63,7 +63,7 @@ public class Win32X86JavaThreadPDAccess implements JavaThreadPDAccess {
osThreadField = type.getAddressField("_osthread"); osThreadField = type.getAddressField("_osthread");
type = db.lookupType("OSThread"); type = db.lookupType("OSThread");
osThreadThreadHandleField = type.getField("_thread_handle"); osThreadThreadIdField = type.getField("_thread_id");
} }
public Address getLastJavaFP(Address addr) { public Address getLastJavaFP(Address addr) {
...@@ -127,10 +127,10 @@ public class Win32X86JavaThreadPDAccess implements JavaThreadPDAccess { ...@@ -127,10 +127,10 @@ public class Win32X86JavaThreadPDAccess implements JavaThreadPDAccess {
// Fetch the OSThread (for now and for simplicity, not making a // Fetch the OSThread (for now and for simplicity, not making a
// separate "OSThread" class in this package) // separate "OSThread" class in this package)
Address osThreadAddr = osThreadField.getValue(addr); Address osThreadAddr = osThreadField.getValue(addr);
// Get the address of the HANDLE within the OSThread // Get the address of the thread_id within the OSThread
Address threadHandleAddr = Address threadIdAddr =
osThreadAddr.addOffsetTo(osThreadThreadHandleField.getOffset()); osThreadAddr.addOffsetTo(osThreadThreadIdField.getOffset());
JVMDebugger debugger = VM.getVM().getDebugger(); JVMDebugger debugger = VM.getVM().getDebugger();
return debugger.getThreadForIdentifierAddress(threadHandleAddr); return debugger.getThreadForIdentifierAddress(threadIdAddr);
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册