There was an old framework on Mac OS X that would find function bounds in an 
unknown code base (back before we had function start addresses) -- on x86 it 
would do as Jim suggests, scan backwards, look for a typical function prologue 
byte sequence (push rbp; mov rsp, rbp) and then disassemble forward again to 
see if it got to the same address.

Any backwards scanning algorithm is surely going to be looking for a 
commonly-occuring sequence of instructions.  The function prologue is as good 
as any, I wouldn't be surprised if the MS disassembler did the same thing.


> On Jan 21, 2015, at 3:02 PM, jing...@apple.com wrote:
> 
> The simple way to do this is to go to the first symbol north of your current 
> address, disassemble forward till you get to the current PC, then display the 
> last N instructions in that disassembly (maybe caching the disassembly for 
> extra credit.)
> 
> There are probably other tricky ways to do this if you know lots about x86, 
> but that's not my area of expertise.
> 
> Jim
> 
> 
>> On Jan 21, 2015, at 2:46 PM, Zachary Turner <ztur...@google.com> wrote:
>> 
>> 
>> 
>> On Wed Jan 21 2015 at 2:30:06 PM <jing...@apple.com> wrote:
>> 
>>> On Jan 21, 2015, at 2:16 PM, Zachary Turner <ztur...@google.com> wrote:
>>> 
>>> On Fri Jan 16 2015 at 1:53:00 PM Greg Clayton <gclay...@apple.com> wrote:
>>> 
>>> Also, did you get my comment about improving functions bounds in the COFF 
>>> parser? If you can do this, you won't really need to do any of the 
>>> unwinding stuff because the assembly unwinder will take care of it, you 
>>> just need to get good function bounds for everything using any means 
>>> necessary in the ObjectFileCOFF parser by making all the symbols you can. 
>>> You also need to identify what parts are trampolines. For example a call to 
>>> printf usually goes through a PLT entry. These are often in one place in 
>>> your binary and often there are not symbols in the symbol table for these. 
>>> Identifying the symbols with a name like "printf" and also making the 
>>> symbol a eSymbolTypeTrampoline will allow us to not set a breakpoint on 
>>> your "printf" trampoline when you say "b printf" on the command line, and 
>>> it will also give function bounds to these small trampoline code sections 
>>> so we can step and unwind through them.
>>> 
>>> 
>>> Regarding the function bounds, I thought about this some, and I'm not sure 
>>> if this is going to be possible.  Consider a system library, like the CRT, 
>>> being linked against with no symbol information.  Where are the function 
>>> bounds going to coem from?  There's nothing in the symbol table of the COFF 
>>> file, and there's no debug info.  And since we're talking about an x86 
>>> binary, unwind info is not part of the ABI.  There's just a huge block of 
>>> code in the code section.  Even if we do have symbols (which is how we 
>>> would determine function bounds for code we have no control over), we will 
>>> only have "public symbols" released by Microsoft.  Public symbols do not 
>>> consist of information about every function, and practically any 
>>> non-trivial call is going to at some point transfer control to one of the 
>>> private functions that have no symbol information.
>> 
>> For generic backtracing, that's going to be a problem.  For instance, if you 
>> want to interrupt & do a backtrace at some random point, you may get a frame 
>> wrong.  If the MS unwind library gets this right, by all means use that as a 
>> host function.  If they get that right, I'd be interested to see how they do 
>> that (though we probably will never know...)  After all, just doing "find 
>> the instruction just before from the current pc" is not entirely trivial on 
>> x86...
>> 
>> It's funny you should mention that, because one of my favorite commands on 
>> Windows is "disassemble backwards".  I actually wanted to implement this in 
>> LLDB eventually.  But I haven't spent time to figure out how Windbg handles 
>> reverse disassembling with no symbol information, or if it works at all.
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to