charm AT lists.siebelschool.illinois.edu
Subject: Charm++ parallel programming system
List archive
- From: Artem Shvorin <art AT shvorin.net>
- To: Phil Miller <mille121 AT illinois.edu>
- Cc: "charm AT cs.uiuc.edu" <charm AT cs.uiuc.edu>
- Subject: Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling
- Date: Sun, 15 Mar 2015 11:49:16 +0300
- List-archive: <http://lists.cs.uiuc.edu/pipermail/charm/>
- List-id: CHARM parallel programming system <charm.cs.uiuc.edu>
Yes, of course, here it is.
2015-03-15 2:07 GMT+03:00 Phil Miller <mille121 AT illinois.edu>:
PhilThanks,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 bitOn Fri, Mar 13, 2015 at 9:12 AM, Artem Shvorin <shvorin AT gmail.com> wrote:_______________________________________________Please, apply this patch against charm branch, if possible.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.
---
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
From d236fc17f65313c90f8bd0e075762f0abca84ec5 Mon Sep 17 00:00:00 2001 From: Artem Shvorin <art AT shvorin.net> Date: Fri, 13 Mar 2015 13:24:29 +0300 Subject: [PATCH] CmiBacktracePrint() uses demangling --- 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] [PATCH] CmiBacktracePrint() uses demangling, Artem Shvorin, 03/13/2015
- Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling, Phil Miller, 03/14/2015
- Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling, Artem Shvorin, 03/15/2015
- Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling, Artem Shvorin, 03/16/2015
- Re: [charm] [ppl] [PATCH] CmiBacktracePrint() uses demangling, Phil Miller, 03/14/2015
Archive powered by MHonArc 2.6.16.