libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libunwind-devel] [RFC] getting file path where a name is


From: Masatake YAMATO
Subject: [Libunwind-devel] [RFC] getting file path where a name is
Date: Sun, 22 Sep 2013 04:06:19 +0900 (JST)

`unw_get_proc_name' returns the name of current procedure.
I'd like to know the path of the file where the name is.
libunwind obviously knows the path. However, there is no
API for getting it.

Attached conceptual patch adds `unw_get_proc_name_and_path' to
libunwind for the purpose.

I have not conduct any kind of test for the patch. I have done
only syntax level check with gcc. 

Could you give me feed back?
If the concept is acceptable, I'd like to prepare better patch.

Regards,
Masatake YAMATO

diff --git a/include/libunwind-common.h.in b/include/libunwind-common.h.in
index fa753ba..e3787d2 100644
--- a/include/libunwind-common.h.in
+++ b/include/libunwind-common.h.in
@@ -180,6 +180,8 @@ typedef struct unw_accessors
        NULL.  */
     int (*get_proc_name) (unw_addr_space_t, unw_word_t, char *, size_t,
                          unw_word_t *, void *);
+    int (*get_proc_name_and_path) (unw_addr_space_t, unw_word_t, char *, 
size_t,
+                                  unw_word_t *, char *, size_t, void *);
   }
 unw_accessors_t;
 
@@ -224,6 +226,7 @@ unw_save_loc_t;
 #define unw_is_signal_frame    UNW_OBJ(is_signal_frame)
 #define unw_handle_signal_frame        UNW_OBJ(handle_signal_frame)
 #define unw_get_proc_name      UNW_OBJ(get_proc_name)
+#define unw_get_proc_name_and_path UNW_OBJ(get_proc_name_and_path)
 #define unw_set_caching_policy UNW_OBJ(set_caching_policy)
 #define unw_regname            UNW_ARCH_OBJ(regname)
 #define unw_flush_cache                UNW_ARCH_OBJ(flush_cache)
@@ -251,6 +254,8 @@ extern int unw_get_save_loc (unw_cursor_t *, int, 
unw_save_loc_t *);
 extern int unw_is_signal_frame (unw_cursor_t *);
 extern int unw_handle_signal_frame (unw_cursor_t *);
 extern int unw_get_proc_name (unw_cursor_t *, char *, size_t, unw_word_t *);
+extern int unw_get_proc_name_and_path (unw_cursor_t *, char *, size_t, 
unw_word_t *,
+                                      char *, size_t);
 extern const char *unw_strerror (int);
 extern int unw_backtrace (void **, int);
 
diff --git a/src/elfxx.c b/src/elfxx.c
index 3d87331..f2435f9 100644
--- a/src/elfxx.c
+++ b/src/elfxx.c
@@ -359,3 +359,25 @@ elf_w (get_proc_name) (unw_addr_space_t as, pid_t pid, 
unw_word_t ip,
 
   return ret;
 }
+
+HIDDEN int
+elf_w (get_proc_name_and_path) (unw_addr_space_t as, pid_t pid, unw_word_t ip,
+                               char *buf, size_t buf_len, unw_word_t *offp,
+                               char *path, size_t path_len)
+{
+  unsigned long segbase, mapoff;
+  struct elf_image ei;
+  int ret;
+
+  ret = tdep_get_elf_image (&ei, pid, ip, &segbase, &mapoff, path, path_len);
+  if (ret < 0)
+    return ret;
+
+  ret = elf_w (get_proc_name_in_image) (as, &ei, segbase, mapoff, ip, buf, 
buf_len, offp);
+
+  munmap (ei.image, ei.size);
+  ei.image = NULL;
+
+  return ret;
+}
+
diff --git a/src/elfxx.h b/src/elfxx.h
index dd1e346..f518513 100644
--- a/src/elfxx.h
+++ b/src/elfxx.h
@@ -47,6 +47,12 @@ extern int elf_w (get_proc_name) (unw_addr_space_t as,
                                  char *buf, size_t len,
                                  unw_word_t *offp);
 
+extern int elf_w (get_proc_name_and_path) (unw_addr_space_t as,
+                                          pid_t pid, unw_word_t ip,
+                                          char *buf, size_t len,
+                                          unw_word_t *offp,
+                                          char *path, size_t path_len);
+
 extern int elf_w (get_proc_name_in_image) (unw_addr_space_t as,
                                           struct elf_image *ei,
                                           unsigned long segbase,
diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c
index daea078..e151655 100644
--- a/src/x86_64/Ginit.c
+++ b/src/x86_64/Ginit.c
@@ -247,6 +247,15 @@ get_static_proc_name (unw_addr_space_t as, unw_word_t ip,
   return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
 }
 
+static int
+get_static_proc_name_and_path (unw_addr_space_t as, unw_word_t ip,
+                              char *buf, size_t buf_len, unw_word_t *offp,
+                              char *path, size_t path_len,
+                              void *arg)
+{
+  return _Uelf64_get_proc_name_and_path (as, getpid (), ip, buf, buf_len, 
offp, path, path_len);
+}
+
 HIDDEN void
 x86_64_local_addr_space_init (void)
 {
@@ -260,6 +269,7 @@ x86_64_local_addr_space_init (void)
   local_addr_space.acc.access_fpreg = access_fpreg;
   local_addr_space.acc.resume = x86_64_local_resume;
   local_addr_space.acc.get_proc_name = get_static_proc_name;
+  local_addr_space.acc.get_proc_name_and_path = get_static_proc_name_and_path;
   unw_flush_cache (&local_addr_space, 0, 0);
 
   memset (last_good_addr, 0, sizeof (unw_word_t) * NLGA);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]