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. On 2020-07-15 23:15, Mathieu Desnoyers wrote:
----- On Jul 15, 2020, at 2:28 PM, rostedt rostedt@xxxxxxxxxxx wrote: On Wed, 15 Jul 2020 20:37:16 +0430 ahmadkhorrami <ahmadkhorrami@xxxxxxxx> wrote: Hi, What is the most efficient way to capture occurrence of a function call/return of a binary program in userspace? It seems the answer is Uprobes. 1) Am I right? But Uprobes use "int" instruction which leads to a switch into kernel mode. 2) Wouldn't it be better to avoid this transition? I'm looking forward to your reply and will be happy to read your opinions. Regards. Hi, I believe LTTng has utilities that can help you trace user space programs.
Indeed, it is documented here: https://lttng.org/docs/#doc-liblttng-ust-cyg-profile If your program is generating function entry/exit at a very high rate (which goes beyond your available I/O throughput and lasts longer than the memory you have available for ring buffers), you will also probably want to use the "blocking-timeout" option documented at: https://lttng.org/docs/#doc-enabling-disabling-channels Thanks, Mathieu
I think there's also a users ftrace like utility that Namhyung was working on. But I don't know where in the development that is. -- Steve