-
Notifications
You must be signed in to change notification settings - Fork 0
Simple QEMU based assembly level profiler
License
guillon/run-qemu-profile
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Summary ======= Provides a simple script run-qemu-profile.sh for assembly level profiling. The script annotates a disassembly with operation counts. It uses the plugin enabled version of QEMU (actually the oprofile plugin) and objdump to merge disassembly with profile information. You may find a QEMU plugin enabled version here: https://github.com/cedric-vincent/QEMU. More information on how to build QEMU with plugins enabled is given in the QEMU Installation section below. Usage ===== It is running in native mode by default with:: $ run-qemu-profile.sh program args... For running in cross execution mode, redefine QEMU and OBJDUMP env. vars as in:: $ env QEMU=qemu-arm OBJDUMP=arm-objdump run-qemu-profile.sh arm_program args... For an example, run the makefile with:: $ make run-profile ... 400610 <loop>: 1 ## 400610: 31 c0 xor %eax,%eax 1 ## 400612: 85 c9 test %ecx,%ecx 1 ## 400614: 7e 38 jle 40064e <loop+0x3e> 1 ## 400616: 45 31 c0 xor %r8d,%r8d 1 ## 400619: eb 19 jmp 400634 <loop+0x24> ## 40061b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 500000 ## 400620: 46 03 0c 82 add (%rdx,%r8,4),%r9d 500000 ## 400624: 46 89 0c 87 mov %r9d,(%rdi,%r8,4) 500000 ## 400628: 49 83 c0 01 add $0x1,%r8 500000 ## 40062c: 44 01 c8 add %r9d,%eax 500000 ## 40062f: 44 39 c1 cmp %r8d,%ecx 500000 ## 400632: 7e 1a jle 40064e <loop+0x3e> 1000000 ## 400634: 41 f6 c0 01 test $0x1,%r8b 1000000 ## 400638: 46 8b 0c 86 mov (%rsi,%r8,4),%r9d 1000000 ## 40063c: 74 e2 je 400620 <loop+0x10> 500000 ## 40063e: 46 89 0c 87 mov %r9d,(%rdi,%r8,4) 500000 ## 400642: 49 83 c0 01 add $0x1,%r8 500000 ## 400646: 44 01 c8 add %r9d,%eax 500000 ## 400649: 44 39 c1 cmp %r8d,%ecx 500000 ## 40064c: 7f e6 jg 400634 <loop+0x24> 1 ## 40064e: f3 c3 repz retq As shown above, the scripts outputs on stdout an annotated disassembly with instruction execution count information. For instance the jump "jg 400634" at PC 40064c is executed 500000 times. Search for the "##" marker in order to isolate actually executed functions and instructions in the disassembly stream. Installation ============ One may install the scripts locally (in $HOME/local/bin) with:: $ make PREFIX=$HOME/local install Or for system level installation (in /usr/local):: $ sudo make install Note that this will install in the corresponding bin directory the three executables run-qemu-profile.sh, run-qemu.sh and merge-profile.sh. QEMU w/ Plugins Installation ============================ If one does not have a QEMU plugin enabled QEMU, install QEMU user-mode with the following steps:: $ wget https://github.com/cedric-vincent/qemu/archive/master.zip -O qemu-master.zip $ unzip qemu-master.zip $ cd qemu-master # Note that the following will enable build for all targets, add # --target-list=x86_64-linux-user for instance to build only for x86_64 $ ./configure --enable-tcg-plugin --disable-system --prefix=$HOME/local $ make all $ make install Verify that you have the oprofile plugin working correctly for instance with: $ qemu-x86_64 -tcg-plugin oprofile /bin/ls 2>oprofile.out $ head oprofile.out ... vma samples % linenr_info image_name symbol_name 000000400080a150 88278 11.0150 (no localization information) ld-2.14.1.so do_lookup_x ... Limitations =========== This tool is itself limited by the QEMU user mode limitations, in particular expect a run time of at least x10 times slower as your program will actually be simulated and the oprofile plugin will add some additional overhead. Also, QEMU user mode does not simulate correctly some multi threaded programs. The scripts will annotate only the main executable in the current version. The oprofile plugin handles shared libraries, but more work is necessary in the run-qemu-profile scripts in order to map the plugin output to the disassembly of the executable and the loaded shared libraries. Support ======= Ref to AUTHORS file for support.
About
Simple QEMU based assembly level profiler
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published