From: Shashank G. <sha...@gm...> - 2012-11-14 13:12:26
|
Hi, I am working on JIKES RVM and was trying to understand the flow of control in case of a simple java program( lets say testfile.java). I am trying to understand the exact point where flow from JIKES RVM passes to the machine instructions of "testfile.java". By experimenting with the source code, I could see that the flow goes from MainThread.java to Reflection.java . Using BaseLine Compiler, it compiles the bytecode of program into machine code and stores the machine code in an array. However, I could not understand what happens after "Magic.invokeMethodReturning.." is called. The corresponding method in Magic.java is not reached. The comment say that "call site should have been hijacked by magic in compiler". How does this happen and which part of the source code does this take place? Basically, I want to print each of the machine-level instructions of "testfile.java" which are executed, hence I was trying to get access to the machine code array as it was being executed. Is there any other easier way to do that ? Thanks in advance. -- Shashank Gupta 4th Year, B.Tech Department of Computer Science and Engineering Indian Institute of Technology Delhi |
From: Eliot M. <mo...@cs...> - 2012-11-14 14:55:12
|
On 11/14/2012 8:11 AM, Shashank Gupta wrote: > Hi, > > I am working on JIKES RVM and was trying to understand the flow of control in case of a simple java > program( lets say testfile.java). > > I am trying to understand the exact point where flow from JIKES RVM passes to the machine > instructions of "testfile.java". > By experimenting with the source code, I could see that the flow goes from MainThread.java to > Reflection.java . Using BaseLine Compiler, it compiles the bytecode of program into machine code and > stores the machine code in an array. > However, I could not understand what happens after "Magic.invokeMethodReturning.." is called. The > corresponding method in Magic.java is not reached. The comment say that "call site should have been > hijacked by magic in compiler". > How does this happen and which part of the source code does this take place? > > Basically, I want to print each of the machine-level instructions of "testfile.java" which are > executed, hence I was trying to get access to the machine code array as it was being executed. Is > there any other easier way to do that ? Do you really need to print it as it is *executed*, or will a dump of the code array do? The latter you can request with appropriate flags to the compilation system. Anyway, as to magics, the Magic class really just describes the interface. For any given magic, wherever there is a call of it the compiler emits special code to perform the indicated action. If you poke around each compiler you can find where that happens. In any case, I am pretty sure that invokeMethodReturning will do the actual invocation. The approach of using magic methods is one of the cool things about Jikes RVM that allows most of the system to be written in Java, but the "hijacking" is admittedly mysterious until you see it explained! Regards -- Eliot Moss |
From: Shashank G. <sha...@gm...> - 2012-11-14 15:18:46
|
Thanks for the reply On Wed, Nov 14, 2012 at 8:25 PM, Eliot Moss <mo...@cs...> wrote: > On 11/14/2012 8:11 AM, Shashank Gupta wrote: > >> Hi, >> >> I am working on JIKES RVM and was trying to understand the flow of >> control in case of a simple java >> program( lets say testfile.java). >> >> I am trying to understand the exact point where flow from JIKES RVM >> passes to the machine >> instructions of "testfile.java". >> By experimenting with the source code, I could see that the flow goes >> from MainThread.java to >> Reflection.java . Using BaseLine Compiler, it compiles the bytecode of >> program into machine code and >> stores the machine code in an array. >> However, I could not understand what happens after >> "Magic.invokeMethodReturning..**" is called. The >> corresponding method in Magic.java is not reached. The comment say that >> "call site should have been >> hijacked by magic in compiler". >> How does this happen and which part of the source code does this take >> place? >> >> Basically, I want to print each of the machine-level instructions of >> "testfile.java" which are >> executed, hence I was trying to get access to the machine code array as >> it was being executed. Is >> there any other easier way to do that ? >> > > Do you really need to print it as it is *executed*, or will > a dump of the code array do? The latter you can request with > appropriate flags to the compilation system. > > I want only those instructions which are actually executed. For example it there is an 'if' condition, then only machine codes corresponding to the branch executed should be shown. > Anyway, as to magics, the Magic class really just describes the > interface. For any given magic, wherever there is a call of it > the compiler emits special code to perform the indicated action. > If you poke around each compiler you can find where that happens. > In any case, I am pretty sure that invokeMethodReturning will do > the actual invocation. > > The approach of using magic methods is one of the cool things > about Jikes RVM that allows most of the system to be written > in Java, but the "hijacking" is admittedly mysterious until > you see it explained! > > Regards -- Eliot Moss > -- Shashank Gupta 4th Year, B.Tech Department of Computer Science and Engineering Indian Institute of Technology Delhi |
From: Jeremy S. <jer...@gl...> - 2012-11-14 15:26:35
|
Hi, > Basically, I want to print each of the machine-level instructions of "testfile.java" which are > executed, hence I was trying to get access to the machine code array as it was being executed. Is > there any other easier way to do that ? I have previously done things like this using Simics https://www.simics.net/simics/info/first-steps.html You need to inject "magic" Simics opcodes or calls to start tracing at the Java program main() entrypoint and stop at exit. Best regards, Jeremy |
From: Eliot M. <mo...@cs...> - 2012-11-14 15:26:20
|
On 11/14/2012 10:18 AM, Shashank Gupta wrote: > Do you really need to print it as it is *executed*, or will > a dump of the code array do? The latter you can request with > appropriate flags to the compilation system. > > > I want only those instructions which are actually executed. For example it there is an 'if' > condition, then only machine codes corresponding to the branch executed should be shown. Well, what you really want, then, is to single-step with gdb or something. The trick is to be able to set a breakpoint where you need to, which you can't do until the code is generated. You'll need to set a breakpoint somewhere in the compiler after the code is generated and before the code is invoked, allowing you to obtain the address of the code array and set a breakpoint. I feel certain that other experts on the list know the exact details of how to do this most conveniently :-) .... Regards -- Eliot Moss |
From: Da F. <jvf...@ya...> - 2012-11-15 01:44:18
|
Hi: It's easier to do this with code inside bootImage, since the RVM.map has code locations. First, break at sysStartMainThread, then after the image is mapped, break at any method entry address of interest. DaFENG Coder Telecommunication && Network Industry Gmail:sun...@gm... ________________________________ From: Eliot Moss <mo...@cs...> To: Shashank Gupta <sha...@gm...> Cc: "General discussion of Jikes RVM design, implementation, issues, and plans" <jik...@li...> Sent: Wednesday, November 14, 2012 11:25 PM Subject: Re: [rvm-research] Flow of control of a simple java program On 11/14/2012 10:18 AM, Shashank Gupta wrote: > Do you really need to print it as it is *executed*, or will > a dump of the code array do? The latter you can request with > appropriate flags to the compilation system. > > > I want only those instructions which are actually executed. For example it there is an 'if' > condition, then only machine codes corresponding to the branch executed should be shown. Well, what you really want, then, is to single-step with gdb or something. The trick is to be able to set a breakpoint where you need to, which you can't do until the code is generated. You'll need to set a breakpoint somewhere in the compiler after the code is generated and before the code is invoked, allowing you to obtain the address of the code array and set a breakpoint. I feel certain that other experts on the list know the exact details of how to do this most conveniently :-) .... Regards -- Eliot Moss ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ Jikesrvm-researchers mailing list Jik...@li... https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers |
From: Eliot M. <mo...@cs...> - 2012-11-15 03:10:12
|
On 11/14/2012 8:44 PM, Da Feng wrote: > Hi: > It's easier to do this with code inside bootImage, since the RVM.map has code locations. First, > break at sysStartMainThread, then after the image is mapped, break at any method entry address of > interest. But that works only for code compiled into the bootimage, not for random Java code loaded and compiled at run time. But here is another wondering -- if the original poster just wants to trace through some ordinary Java code, the Eclipse debugger is the right tool. As is often the case, we can frequently help better if we know more the context of what you are REALLY trying to accomplish overall and why you think you need to do this particular thing .... Best -- Eliot |
From: Shashank G. <sha...@gm...> - 2012-11-15 10:30:10
|
On Thu, Nov 15, 2012 at 8:40 AM, Eliot Moss <mo...@cs...> wrote: > On 11/14/2012 8:44 PM, Da Feng wrote: > > Hi: > > It's easier to do this with code inside bootImage, since the RVM.map has > code locations. First, > > break at sysStartMainThread, then after the image is mapped, break at > any method entry address of > > interest. > > But that works only for code compiled into the bootimage, > not for random Java code loaded and compiled at run time. > > But here is another wondering -- if the original poster > just wants to trace through some ordinary Java code, the > Eclipse debugger is the right tool. > > As is often the case, we can frequently help better if > we know more the context of what you are REALLY trying > to accomplish overall and why you think you need to do > this particular thing .... > > The main reason I wanted to print each instruction as it was being executed is because I wanted to get complete information of the execution of a java program, i.e., all memory addresses it is accessing and all registers it is accessing. The reason I want to do this inside JIKES (or any VM for that matter) is because other hardware monitors give such information of both JIKES and java program, while I want that information only for the java program. Also, another question, does the optimizing compiler have a mechanism to get such usage statistics about the program? If yes then how can I either add a new optimizing compiler or make changes to it ? > Best -- Eliot > > > ------------------------------------------------------------------------------ > Monitor your physical, virtual and cloud infrastructure from a single > web console. Get in-depth insight into apps, servers, databases, vmware, > SAP, cloud infrastructure, etc. Download 30-day Free Trial. > Pricing starts from $795 for 25 servers or applications! > http://p.sf.net/sfu/zoho_dev2dev_nov > _______________________________________________ > Jikesrvm-researchers mailing list > Jik...@li... > https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers > Thanks again. -- Shashank Gupta 4th Year, B.Tech Department of Computer Science and Engineering Indian Institute of Technology Delhi |
From: Eliot M. <mo...@cs...> - 2012-11-15 13:11:16
|
On 11/15/2012 5:29 AM, Shashank Gupta wrote: > Also, another question, does the optimizing compiler have a mechanism to get such usage statistics > about the program? If yes then how can I either add a new optimizing compiler or make changes to it ? What statistics? It sounded to me as if you wanted a trace, not statistics. Can you clarify? Of course you can add a compiler or make changes to the existing one, but you're talking about a complex, production-quality system, whose learning curve is somewhat steep. One way you might separate system and user code effects is as follows, along the lines of what the DaCapo benchmarks try to do. 1) Set up the application you want to measure with a top-level wrapper or harness that can iterate the application. 2) Take your measurements only after some number of iterations, and only for the duration of an iteration. Since you can do an arbitrary thing to mark the start and the end, you can effectively "turn on" your recording and turn it off. For example, you might set a certain static variable to 1 then to 0. Or, you might include a small native routine that you call, which does something readily distinguishable to your monitoring system. 3) You can simplify convergence if you given command line arguments to force all code to be optimized when first encountered, etc. This means that your second iteration and ones after it will be on the same code. However, since it causes *everything* to be optimized, it does not give the same result as running a real program would, since a real program would not have every method optimized to a high level. 5) This approach will still include memory allocation and garbage collection -- but, particularly if you force a full gc before the iteration you measure, it will be only application-induced gc, not allocation and gc caused by the Jikes RVM compilers, etc. Does this correspond more closely to what you are after? Regards -- EM |
From: Eliot M. <mo...@cs...> - 2012-11-15 11:58:18
|
On 11/15/2012 5:29 AM, Shashank Gupta wrote: > > > On Thu, Nov 15, 2012 at 8:40 AM, Eliot Moss <mo...@cs... <mailto:mo...@cs...>> wrote: > > On 11/14/2012 8:44 PM, Da Feng wrote: > > Hi: > > It's easier to do this with code inside bootImage, since the RVM.map has code locations. First, > > break at sysStartMainThread, then after the image is mapped, break at any method entry address of > > interest. > > But that works only for code compiled into the bootimage, > not for random Java code loaded and compiled at run time. > > But here is another wondering -- if the original poster > just wants to trace through some ordinary Java code, the > Eclipse debugger is the right tool. > > As is often the case, we can frequently help better if > we know more the context of what you are REALLY trying > to accomplish overall and why you think you need to do > this particular thing .... > > The main reason I wanted to print each instruction as it was being executed is because I wanted to > get complete information of the execution of a java program, i.e., all memory addresses it is > accessing and all registers it is accessing. > > The reason I want to do this inside JIKES (or any VM for that matter) is because other hardware > monitors give such information of both JIKES and java program, while I want that information only > for the java program. > > Also, another question, does the optimizing compiler have a mechanism to get such usage statistics > about the program? If yes then how can I either add a new optimizing compiler or make changes to it ? It is not easy to distinguish system from user program execution. You could separate things according to whether the PC value lies within the boot image, but that would include user program execution of library routines that are also used by the system. You could, using the maps produced during boot image construction, distinguish between particular methods, but still, that would not distinguish whether a library routine is being executed on behalf of a user thread or for some system action. Still, with some effort and cleverness one might distinguish them, based on tracking the call stack of each thread. It is certainly *possible* to run a tool like valgrind with Jikes RVM -- I have done it, and there is some information about how to do it in the web pages or wiki. I am wondering if that would help meet your need? Regards -- Eliot Moss |
From: Robin G. <rob...@gm...> - 2012-11-15 23:29:51
|
On 15/11/12 22:58, Eliot Moss wrote: > On 11/15/2012 5:29 AM, Shashank Gupta wrote: >> >> On Thu, Nov 15, 2012 at 8:40 AM, Eliot Moss <mo...@cs... <mailto:mo...@cs...>> wrote: >> >> On 11/14/2012 8:44 PM, Da Feng wrote: >> > Hi: >> > It's easier to do this with code inside bootImage, since the RVM.map has code locations. First, >> > break at sysStartMainThread, then after the image is mapped, break at any method entry address of >> > interest. >> >> But that works only for code compiled into the bootimage, >> not for random Java code loaded and compiled at run time. >> >> But here is another wondering -- if the original poster >> just wants to trace through some ordinary Java code, the >> Eclipse debugger is the right tool. >> >> As is often the case, we can frequently help better if >> we know more the context of what you are REALLY trying >> to accomplish overall and why you think you need to do >> this particular thing .... >> >> The main reason I wanted to print each instruction as it was being executed is because I wanted to >> get complete information of the execution of a java program, i.e., all memory addresses it is >> accessing and all registers it is accessing. >> >> The reason I want to do this inside JIKES (or any VM for that matter) is because other hardware >> monitors give such information of both JIKES and java program, while I want that information only >> for the java program. >> >> Also, another question, does the optimizing compiler have a mechanism to get such usage statistics >> about the program? If yes then how can I either add a new optimizing compiler or make changes to it ? > It is not easy to distinguish system from user program > execution. You could separate things according to whether > the PC value lies within the boot image, but that would > include user program execution of library routines that are > also used by the system. You could, using the maps produced > during boot image construction, distinguish between particular > methods, but still, that would not distinguish whether a > library routine is being executed on behalf of a user thread > or for some system action. Still, with some effort and > cleverness one might distinguish them, based on tracking > the call stack of each thread. If you write to Yi Lin, you can probably get hold of the code behind [1], which is the most comprehensive work on separating Jikes RVM from the mutator. It is certainly *possible* to run a tool like valgrind with Jikes RVM -- I have done it, and there is some information about how to do it in the web pages or wiki. I am wondering if that would help meet your need? Another possibility would be to use a hardware simulator like PTLsim, but valgrind would be an easier option if it serves your purpose. cheers, Robin [1] http://dx.doi.org/10.1145/2151024.2151048 |