Reputation: 129
I'm new to writing a pin tool to instrument the program. Currently, I'm kind of stuck with printing out the program name (image? I would say) and the function that the instruction belongs to. For example, I I have a program foo.cpp and function name func() that simple addition and cout. Then, when I use a pin tool, I want to print like below
0xAddress foo (or lib64/ld-linux... etc) func disassembled_instruction (ex. move etc)
I can get the address and disassembled instructions, but not the program and function name.
Can anyone suggest me whether this is possible and how?
Thank you!
Upvotes: 1
Views: 2696
Reputation: 8176
Program Name
To get the full path to the main binary (hence the program name) you must set an instrumentation routine for IMG (image) in your main()
using IMG_AddInstrumentFunction.
In the analysis callback (passed to IMG_AddInstrumentFunction
) use the IMG_IsMainExecutable function which simply returns a boolean indicating if the currently loaded image is the main binary (true
) or not.
If the former function (IMG_IsMainExecutable
) returns true
you can call IMG_Name to get its full path.
For a full example see the Detecting the Loading and Unloading of Images (Image Instrumentation) example in the manual.
Function Name
Use PIN_InitSymbols in your main, before calling PIN_StartProgram
.
You can instrument at the routine level using RTN_AddInstrumentFunction (or get the routine from the instruction, BBL or TRACE).
Once you have the RTN (routine), you can get its name with the RTN_Name function.
Check the manual for the example Procedure Instruction Count (Routine Instrumentation) which should give you a good start on how to use these functions.
Note: as obvious as its sounds, the target executable must have symbolic information (symbols): No symbols == no routine names
.
Upvotes: 3
Reputation: 62
You can use standard predefined macros for printing out the program and function name.
cout << __FILE__ << " " << __FUNCTION__ << endl;
Upvotes: 0