[lttng-dev] Capturing User-Level Function Calls/Returns
ahmadkhorrami
ahmadkhorrami at ut.ac.ir
Wed Jul 15 18:25:59 EDT 2020
So, the only barrier to the user-level implementation is the problem
with instruction sizes. That's an enlightening point. Thanks for the
detailed answer!
Thanks everybody specially Steven and Mathieu.
Regards.
On 2020-07-16 02:18, Steven Rostedt wrote:
> On Thu, 16 Jul 2020 02:09:50 +0430
> ahmadkhorrami <ahmadkhorrami at ut.ac.ir> wrote:
>
>> Hi Steven and Mathieu,
>> Firstly, many thanks! This method seems to be the most efficient
>> method.
>> But, IIUC, what you suggest requires source code compilation. I need
>> an
>> efficient dynamic method that, given the function address, captures
>> its
>> occurrence and stores some information from the execution context. Is
>> there anything better than Uprobes perhaps with no trap into the
>> kernel?
>> Why do we need traps?
>> Regards.
>
> Without recompiling, how would that be implemented?
>
> You would need to insert a jump on top of code, and still be able to
> preserve that code. What a trap does, is to insert a int3, that will
> trap into the kernel, it would then emulate the code that the int3 was
> on, and also call some code that can trace the current state.
>
> To do it in user land, you would need to find way to replace the code
> at the location you want to trace, with a jump to the tracing
> infrastructure, that will also be able to emulate the code that the
> jump was inserted on top of. As on x86, that jump will need to be 5
> bytes long (covering 5 bytes of text to emulate), where as a int3 is a
> single byte.
>
> Thus, you either recompile and insert nops where you want to place your
> jumps, or you trap using int3 that can do the work from within the
> kernel.
>
> -- Steve
More information about the lttng-dev
mailing list