Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
LIBUNWIND-NTO(3libunwind)     Programming Library      LIBUNWIND-NTO(3libunwind)

NAME
     libunwind-nto -- QNX Neutrino support in libunwind

SYNOPSIS
     #include <libunwind-nto.h>

     unw_accessors_t unw_nto_accessors;

     void *unw_nto_create(pid_t, pthread_t);
     void unw_nto_destroy(void *);

     int unw_nto_find_proc_info(unw_addr_space_t, unw_word_t, unw_proc_info_t *,
     int, void *);
     void unw_nto_put_unwind_info(unw_addr_space_t, unw_proc_info_t *, void *);
     int unw_nto_get_dyn_info_list_addr(unw_addr_space_t, unw_word_t *, void *);
     int  unw_nto_access_mem(unw_addr_space_t,	unw_word_t,  unw_word_t  *, int,
     void *);
     int unw_nto_access_reg(unw_addr_space_t, unw_regnum_t, unw_word_t	*,  int,
     void *);
     int  unw_nto_access_fpreg(unw_addr_space_t,  unw_regnum_t,  unw_fpreg_t  *,
     int, void *);
     int unw_nto_get_proc_name(unw_addr_space_t,  unw_word_t,  char  *,  size_t,
     unw_word_t *, void *);
     int unw_nto_resume(unw_addr_space_t, unw_cursor_t *, void *);

DESCRIPTION
     The  QNX operating system makes it possible for a process to gain access to
     the machine state and virtual memory of another  process,	or  a  different
     thread  within the same process.  gain access to the machine state and vir-
     tual memory of another it is possible  to	hook  up  libunwind  to  another
     process.	While  it's not very difficult to do so directly, libunwind fur-
     ther facilitates this task by providing  ready-to-use  callbacks  for  this
     purpose.	The routines and variables implementing this facility use a name
     prefix of unw_nto, which is stands for ``unwind-via-nto''.

     An application that wants to use the libunwind NTO remote needs to take the
     following steps.

     1.     Create a new libunwind  address-space  that  represents  the  target
	    process and thread. This is done by calling unw_create_addr_space().
	    In	many cases, the application will simply want to pass the address
	    of unw_nto_accessors as the first argument to this routine. Doing so
	    will ensure that libunwind will be able to properly unwind the  tar-
	    get process.

     2.     Create  an	NTO  info structure by calling unw_nto_create(), passing
	    the pid and tid of the target process thread as the arguments.  This
	    will stop the target thread. The process  ID  (pid)  of  the  target
	    process  must be known, and only a single thread can be unwound at a
	    time so the thread ID (tid) must also be specified.

     3.     The opaque pointer returned then needs to be passed as  the  ``argu-
	    ment'' pointer (third argument) to unw_init_remote().

     When  the	application  is  done  using  libunwind  on  the target process,
     unw_nto_destroy() needs to be called, passing it the  opaque  pointer  that
     was returned by the call to unw_nto_create().  This ensures that all memory
     and other resources are freed up.

     The unw_nto_resume() is not supported on the NTO remote.

     In special circumstances, an application may prefer to use only portions of
     the libunwind NTO remote. For this reason, the individual callback routines
     (unw_nto_find_proc_info(), unw_nto_put_unwind_info(), etc.) are also avail-
     able  for direct use. Of course, the addresses of these routines could also
     be picked up from unw_nto_accessors, but doing so would prevent static ini-
     tialization. Also, when using unw_nto_accessors, all the callback	routines
     will  be  linked  into  the  application,	even  if they are never actually
     called.

THREAD SAFETY
     The libunwind NTO remote assumes that a single  unw_nto-info  structure  is
     never shared between threads of the unwinding program.  Because of this, no
     explicit  locking	is  used.   As	long as only one thread uses an NTO info
     structure at any given time, this facility is thread-safe.

RETURN VALUE
     unw_nto_create() may return a NULL if it  fails  to  create  the  NTO  info
     structure for any reason.

FILES
     libunwind-nto.h
	     Headerfile  to include when using the interface defined by this li-
	    brary.

     -lunwind-nto -lunwind-generic
	     Linker-switches to add when building a program that uses the  func-
	    tions defined by this library.

EXAMPLE
	 #include <libunwind-nto.h>
	 #include <stdio.h>
	 #include <stdlib.h>

	 int
	 main (int argc, char **argv)
	 {
	   if (argc != 2) {
	     fprintf (stderr, "usage: %s PID\n", argv[0]);
	     exit (EXIT_FAILURE);
	   }

	   char *endptr;
	   pid_t target_pid = strtoul (argv[1], &endptr, 10);
	   if (target_pid == 0 && argv[1] == endptr) {
	     fprintf (stderr, "usage: %s PID\n", argv[0]);
	     exit (EXIT_FAILURE);
	   }

	   unw_addr_space_t as = unw_create_addr_space (&unw_nto_accessors, 0);
	   if (!as) {
	     fprintf (stderr, "unw_create_addr_space() failed");
	     exit (EXIT_FAILURE);
	   }

	   void *ui = unw_nto_create (target_pid, (thread_t)1);
	   if (!ui) {
	     fprintf (stderr, "unw_nto_create() failed");
	     exit (EXIT_FAILURE);
	   }

	   unw_cursor_t cursor;
	   int ret = unw_init_remote (&cursor, as, ui);
	   if (ret < 0) {
	     fprintf (stderr, "unw_init_remote() failed: ret=%d\n", ret);
	     exit (EXIT_FAILURE);
	   }

	   do {
	     unw_proc_info_t pi;
	     ret = unw_get_proc_info (&cursor, &pi);
	     if (ret == -UNW_ENOINFO) {
	       fprintf (stdout, "no info\n");
	     } else if (ret >= 0) {
	       printf ("\tproc=%#016lx-%#016lx\thandler=%#016lx lsda=%#016lx",
		       (long) pi.start_ip, (long) pi.end_ip,
		       (long) pi.handler, (long) pi.lsda);
	     }
	     ret = unw_step (&cursor);
	   } while (ret > 0);
	   if (ret < 0) {
	     fprintf (stderr, "unwind failed with ret=%d\n", ret);
	     exit (EXIT_FAILURE);
	   }

	   unw_nto_destroy (ui);
	   unw_destroy_addr_space (as);
	   exit (EXIT_SUCCESS);
	 }

SEE ALSO
     libunwind(3libunwind)

Programming Library		 29 August 2023        LIBUNWIND-NTO(3libunwind)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=libunwind-nto&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help