The ktrace utility enables kernel trace logging for the specified processes. Kernel trace data is logged to the file ktrace.out. The kernel operations that are traced include system calls, namei translations, sig nal processing, and I/O. Once tracing is enabled on a process, trace data will be logged until either the process exits or the trace point is cleared. A traced process can generate enormous amounts of log data quickly; It is strongly suggested that users memorize how to disable tracing before attempting to trace a process.

To trace all kernel operations for process id # 2546, enter:$ ktrace -p 2546 To disable all tracing of process # 2546, enter:$ ktrace -cp 2546 To disable tracing on all user-owned processes, and, if executed by root, all processes in the system:# ktrace -C Attach to process id # 123 and log trace records to myapp.dbg.log instead of ktrace.out.$ ktrace -p 123 -f myapp.dbg.log To enable tracing of I/O on process # 123$ ktrace -ti -p 123 The -t option is very useful to trace various kernel trace points, one per letter. The following table equates the letters with the trace points:

c : trace system calls

n : trace namei translations

i : trace I/O

s : trace signal processing

u : userland traces

w : context switches

+ : trace the default set of trace points – c, n, i, s, u

Run the command called myapp and track only system calls, enter:$ ktrace -tc ./myapp Please note that the output of ktrace is not as informative as strace, but it does help to solve many problems.

truss: trace system calls

FreeBSD has another tool called truss. It traces the system calls called by the specified process or program. Output is to the specified output file, or standard error by default. Attach to an already-running process # 123, enter$ truss -p 123 Follow the system calls used myapp$ truss ./myapp -d /tmp -f 120 Same as above, but put the output into a file called /tmp/myapp.dbg$ truss -o /tmp/truss.out ./myapp -d /tmp -f 120