Skip to Content.
Sympa Menu

charm - Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling

charm AT lists.siebelschool.illinois.edu

Subject: Charm++ parallel programming system

List archive

Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling


Chronological Thread 
  • From: Phil Miller <mille121 AT illinois.edu>
  • To: Artem Shvorin <shvorin AT gmail.com>
  • Cc: "charm AT cs.uiuc.edu" <charm AT cs.uiuc.edu>
  • Subject: Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling
  • Date: Sat, 14 Mar 2015 18:07:54 -0500
  • List-archive: <http://lists.cs.uiuc.edu/pipermail/charm/>
  • List-id: CHARM parallel programming system <charm.cs.uiuc.edu>

Hi Artem,

Thank you for the contribution, and for taking an interest in Charm++.

Would you mind resending your patch as an attachment, such as generated by git format-patch? It looks like the mailing list mangled it in the body of your message a little bit

Thanks,

Phil

On Fri, Mar 13, 2015 at 9:12 AM, Artem Shvorin <shvorin AT gmail.com> wrote:
Hi,

I'd like to have Charm++ stack trace demangled, so I suggest a patch altering 
CmiBacktracePrint(). It looks a bit awkward, for instance I don't know where's the right place to define a wrapper for abi::__cxa_demangle(). However, the stack is still being dumped in the same manner.

Please, apply this patch against charm branch, if possible.

---
 src/conv-core/convcore.c     | 38 ++++++++++++++++++++++++++++++--------
 src/conv-core/debug-conv++.C |  9 ++++++++-
 2 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/src/conv-core/convcore.c b/src/conv-core/convcore.c
index a0b594e..348bf32 100644
--- a/src/conv-core/convcore.c
+++ b/src/conv-core/convcore.c
@@ -230,6 +230,9 @@ void  LrtsFree(void*);
 CpvStaticDeclare(int, cmiMyPeIdle);
 int CmiIsMyNodeIdle();
 
+/* plain C wrapper for abi::__cxa_demangle */
+char *cxa_demangle(const char *mangled_name, char *output_buffer, size_t *length, int *status);
+
 /*****************************************************************************
  *
  * Command-Line Argument (CLA) parsing routines.
@@ -565,6 +568,8 @@ static const char* _implGetBacktraceSys(const char *name) {
 /** Print out the names of these function pointers. */
 void CmiBacktracePrint(void **retPtrs,int nLevels) {
   if (nLevels>0) {
+    char *dmgl_buffer = NULL;
+    size_t dmgl_len = 0;
     int i;
     char **names=CmiBacktraceLookup(retPtrs,nLevels);
     if (names==NULL) return;
@@ -572,18 +577,35 @@ void CmiBacktracePrint(void **retPtrs,int nLevels) {
     for (i=0;i<nLevels;i++) {
       if (names[i] == NULL) continue;
       {
-      const char *trimmed=_implTrimParenthesis(names[i], 0);
-      const char *print=trimmed;
-      const char *sys=_implGetBacktraceSys(print);
-      if (sys) {
-          CmiPrintf("  [%d] Charm++ Runtime: %s (%s)\n",i,sys,print);
+        const char *trimmed=_implTrimParenthesis(names[i], 0);
+        const char *print=trimmed;
+        const char *sys=_implGetBacktraceSys(print);
+        char *funcname = /* const violation */(char*)print, *plusSign = funcname;
+        while (*plusSign != 0) {
+          if (*plusSign == '+') {
+            *plusSign = '\0';
+            ++plusSign;
+            break;
+          }
+          ++plusSign;
+        }
+        int status;
+        char *dmgl_result = cxa_demangle(funcname, dmgl_buffer, &dmgl_len, &status);
+        if(dmgl_result)
+          dmgl_buffer = dmgl_result;
+        if(0 != status)
+          dmgl_result = funcname; /* fall back without demangling */
+        if (sys) {
+          CmiPrintf("  [%d] Charm++ Runtime: %s (%s%s%s)\n",i,sys,dmgl_result,*plusSign?"+":"",plusSign);
           break; /*Stop when we hit Charm++ runtime.*/
-      } else {
-          CmiPrintf("  [%d:%d] %s\n",CmiMyPe(),i,print);
+        } else {
+          CmiPrintf("  [%d:%d] %s%s%s\n",CmiMyPe(),i,dmgl_result,*plusSign?"+":"",plusSign);
+        }
       }
-     }
     }
     free(names);
+    if(dmgl_buffer)
+      free(dmgl_buffer);
   }
 }
 
diff --git a/src/conv-core/debug-conv++.C b/src/conv-core/debug-conv++.C
index be67935..e658595 100644
--- a/src/conv-core/debug-conv++.C
+++ b/src/conv-core/debug-conv++.C
@@ -1,3 +1,4 @@
+#include <cxxabi.h>
 
 #include "converse.h"
 #include "debug-conv++.h"
@@ -30,4 +31,10 @@ void CpdListAccessor::beginItem(PUP::er &p,int itemNo)
   CpdListBeginItem_impl(p,itemNo);
 }
 
-
+extern "C" {
+  /* plain C wrapper for abi::__cxa_demangle */
+  char *cxa_demangle(const char *mangled_name, char *output_buffer, size_t *length, int *status)
+  {
+    return abi::__cxa_demangle(mangled_name, output_buffer, length, status);
+  }
+}
--
2.1.4



_______________________________________________
charm mailing list
charm AT cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/charm

_______________________________________________
ppl mailing list
ppl AT cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/ppl





Archive powered by MHonArc 2.6.16.

Top of Page