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

FreeBSD Manual Pages

  
 
  

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  dif-
       ferent  thread  within  the  same  process.  gain access	to the machine
       state and virtual memory	of another it is possible to hook up libunwind
       to another process.  While it's not very	difficult to do	 so  directly,
       libunwind further facilitates this task by providing ready-to-use call-
       backs  for  this	purpose.  The routines and variables implementing this
       facility	use a name prefix  of  unw_nto,	 which	is  stands  for	 ``un-
       wind-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_cre-
	      ate_addr_space().	  In  many  cases, the application will	simply
	      want to pass the address of unw_nto_accessors as the first argu-
	      ment to this routine. Doing so will ensure that  libunwind  will
	      be able to properly unwind the target process.

       2.     Create  an NTO info structure by calling unw_nto_create(), pass-
	      ing the pid and tid of the target	process	thread	as  the	 argu-
	      ments.   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 ``ar-
	      gument'' 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 por-
       tions 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	 available for direct use. Of course, the addresses of
       these routines could also be picked up from unw_nto_accessors, but  do-
       ing   so	  would	  prevent  static  initialization.  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
	      library.

       -lunwind-nto -lunwind-generic
	       Linker-switches to add when building a program  that  uses  the
	      functions	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+14.3.quarterly>

home | help