mailarchive of the ptxdist mailing list
 help / color / mirror / Atom feed
* [ptxdist] [PATCH 1/2] os: Add execinfo::demangleCxxName()
@ 2012-03-22 12:49 bernhard
  2012-03-22 12:49 ` [ptxdist] [PATCH 2/2] os: Add execinfo::backtrace() bernhard
  0 siblings, 1 reply; 4+ messages in thread
From: bernhard @ 2012-03-22 12:49 UTC (permalink / raw)
  To: ptxdist; +Cc: Bernhard Walle

From: Bernhard Walle <walle@corscience.de>

Signed-off-by: Bernhard Walle <walle@corscience.de>
---
 CMakeLists.txt                 |    5 ++++
 NEWS                           |    4 +++
 csstdxx/CMakeLists.txt         |    1 +
 csstdxx/config.h.in            |    2 ++
 csstdxx/os.h                   |    1 +
 csstdxx/os/execinfo.h          |   62 ++++++++++++++++++++++++++++++++++++++++
 csstdxx/os/execinfo_common.cpp |   49 +++++++++++++++++++++++++++++++
 csstdxx/os/os.doxy             |    3 ++
 examples/os/CMakeLists.txt     |    4 +++
 examples/os/c++filt.cpp        |   13 +++++++++
 tests/test_os.cpp              |   19 ++++++++++++
 tests/test_os.h                |   11 +++++++
 12 files changed, 174 insertions(+)
 create mode 100644 csstdxx/os/execinfo.h
 create mode 100644 csstdxx/os/execinfo_common.cpp
 create mode 100644 examples/os/c++filt.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0aa43eb..63de09d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -159,6 +159,11 @@ unset(CMAKE_REQUIRED_DEFINITIONS)
 check_symbol_exists(readdir_r "dirent.h" HAVE_READDIR_R)
 check_symbol_exists(getpwuid_r "pwd.h" HAVE_GETPWUID_R)
 
+include(CheckCXXSymbolExists)
+check_include_file_cxx("cxxabi.h" HAVE_CXXABI_H)
+if (HAVE_CXXABI_H)
+    check_cxx_symbol_exists(abi::__cxa_demangle "cxxabi.h" HAVE_ABI_CXA_DEMANGLE)
+endif (HAVE_CXXABI_H)
 
 include (CheckTypeExistsCXX)
 
diff --git a/NEWS b/NEWS
index 440305b..752220a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+0.5.1
+-----
+ * os: Add execinfo::demangleCxxName().
+
 0.5.0
 -----
  * concurrent: Add MutexLocker::unlock().
diff --git a/csstdxx/CMakeLists.txt b/csstdxx/CMakeLists.txt
index bfd5c57..71af070 100644
--- a/csstdxx/CMakeLists.txt
+++ b/csstdxx/CMakeLists.txt
@@ -61,6 +61,7 @@ set(CSSTDXX_SRC
     io/lockfile_common.cpp
 
     os/fileutils.cpp
+    os/execinfo_common.cpp
 
     process/atexitexecuter.cpp
 )
diff --git a/csstdxx/config.h.in b/csstdxx/config.h.in
index 0a8304d..ecf135f 100644
--- a/csstdxx/config.h.in
+++ b/csstdxx/config.h.in
@@ -76,6 +76,8 @@
 #cmakedefine HAVE_OPEN64_LFS
 #cmakedefine HAVE_READDIR_R
 #cmakedefine HAVE_GETPWUID_R
+#cmakedefine HAVE_CXXABI_H
+#cmakedefine HAVE_ABI_CXA_DEMANGLE
 
 #cmakedefine WITH_SERIAL_BUS_ACCESS
 #cmakedefine HAVE_CLOCK_GETTIME
diff --git a/csstdxx/os.h b/csstdxx/os.h
index d7ceefe..389c4bb 100644
--- a/csstdxx/os.h
+++ b/csstdxx/os.h
@@ -14,5 +14,6 @@
 #include <csstdxx/os/tempfile.h>
 #include <csstdxx/os/fileutils.h>
 #include <csstdxx/os/process.h>
+#include <csstdxx/os/execinfo.h>
 
 #endif /* CSSTDXX_CSSTDXX_OS_H_ */
diff --git a/csstdxx/os/execinfo.h b/csstdxx/os/execinfo.h
new file mode 100644
index 0000000..49cc21f
--- /dev/null
+++ b/csstdxx/os/execinfo.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) Corscience GmbH & Co. KG
+ *
+ * Projectname - Redmine:CSstdxx
+ * Module ID - os
+ */
+
+#ifndef CSSTDXX_OS_EXECINFO_H_
+#define CSSTDXX_OS_EXECINFO_H_
+
+#include <string>
+
+namespace cs {
+namespace os {
+namespace execinfo {
+
+/**
+ * \brief Demangles a C++ identifier
+ *
+ * Sometimes C++ identifiers appear with name mangling applied, for example
+ * in that piece of code, at least on Linux/gcc (the standard doesn't say anything
+ * about what the type information string should look like):
+ *
+ * \code
+ * #include <typeinfo>
+ *
+ * struct Vehicle {
+ *     virtual ~Vehicle() {} // the type should have RTTI
+ * };
+ *
+ * struct Car : public Vehicle {};
+ *
+ * Vehicle *v = new Car;
+ * std::cout << "v is a " << typeid(*v).name() << std::endl;
+ * \endcode
+ *
+ * On Linux, this prints <tt>"3Car"</tt> instead of just <tt>"Car"</tt>. While that
+ * can be decoded simply by looking at the name, there are situations where
+ * the names are more complex.
+ *
+ * On the commandline on Linux you can use <tt>c++filt</tt> to demangle such names.
+ * Programmatically there are different compiler-specific APIs to decode them.
+ * cs::os::execinfo::demangleCxxName() is a wrapper around them.
+ *
+ * \note Currently this function is implemented when libstdc++ is used (independent
+ *       of the operating system). Tested with clang and gcc on Linux.
+ *
+ * \param[in] name the name that should be demangled
+ * \param[out] ok if not NULL, then this variable will be set to \c true on success
+ *             or to \c false on failure.
+ * \return the demangled name on success or \p name on failure.
+ * \since 0.5.1
+ * \ingroup os_execinfo
+ * \sa http://en.wikipedia.org/wiki/Name_mangling
+ */
+std::string demangleCxxName(const char *name, bool *ok=NULL);
+
+} // namespace execinfo
+} // namespace os
+} // namespace cs
+
+#endif /* CSSTDXX_OS_EXECINFO_H_ */
diff --git a/csstdxx/os/execinfo_common.cpp b/csstdxx/os/execinfo_common.cpp
new file mode 100644
index 0000000..e9bee8a
--- /dev/null
+++ b/csstdxx/os/execinfo_common.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) Corscience GmbH & Co. KG
+ *
+ * Projectname - Redmine:CSstdxx
+ * Module ID - os
+ */
+
+#include <csstdxx/config.h>
+#include <cstdlib>
+#include "execinfo.h"
+
+#ifdef HAVE_CXXABI_H
+#  include <cxxabi.h>
+#endif
+
+namespace cs {
+namespace os {
+namespace execinfo {
+
+#if defined(HAVE_ABI_CXA_DEMANGLE)
+std::string demangleCxxName(const char *name, bool *ok)
+{
+    int status;
+    char* result = abi::__cxa_demangle(name, NULL, 0, &status);
+    if (result && status == 0) {
+        if (ok)
+            *ok = true;
+        std::string resultString(result);
+        free(result);
+        return resultString;
+    }
+    else {
+        if (ok)
+            *ok = false;
+        return std::string(name);
+    }
+}
+#else
+std::string demangleCxxName(const char *name, bool *ok)
+{
+    if (ok)
+        *ok = false;
+    return std::string();
+}
+#endif
+
+} // namespace execinfo
+} // namespace os
+} // namespace cs
diff --git a/csstdxx/os/os.doxy b/csstdxx/os/os.doxy
index 4b9838e..57d5336 100644
--- a/csstdxx/os/os.doxy
+++ b/csstdxx/os/os.doxy
@@ -15,6 +15,9 @@
 \defgroup os_process Process utilities
 \ingroup os
 
+\defgroup os_execinfo Runtime execution information
+\ingroup os
+
 */
 
 // vim: set ft=doxygen:
diff --git a/examples/os/CMakeLists.txt b/examples/os/CMakeLists.txt
index d96de60..e117fb7 100644
--- a/examples/os/CMakeLists.txt
+++ b/examples/os/CMakeLists.txt
@@ -25,6 +25,10 @@ add_executable(tempfile tempfile.cpp)
 target_link_libraries(tempfile csstdxx)
 set(EXAMPLE_PROGRAMS ${EXAMPLE_PROGRAMS} tempfile)
 
+add_executable(c++filt c++filt.cpp)
+target_link_libraries(c++filt csstdxx)
+set(EXAMPLE_PROGRAMS ${EXAMPLE_PROGRAMS} c++filt)
+
 if (INSTALL_CSSTDXX_EXAMPLES)
     install(TARGETS ${EXAMPLE_PROGRAMS} DESTINATION bin/csstdxx)
 endif (INSTALL_CSSTDXX_EXAMPLES)
diff --git a/examples/os/c++filt.cpp b/examples/os/c++filt.cpp
new file mode 100644
index 0000000..6a36e32
--- /dev/null
+++ b/examples/os/c++filt.cpp
@@ -0,0 +1,13 @@
+#include <iostream>
+#include <csstdxx/os.h>
+
+int main(int argc, char *argv[])
+{
+    if (argc != 2) {
+        std::cerr << "Usage: c++filt <symbol>" << std::endl;
+        return -1;
+    }
+
+    std::cout << cs::os::execinfo::demangleCxxName(argv[1]) << std::endl;
+    return 0;
+}
diff --git a/tests/test_os.cpp b/tests/test_os.cpp
index 29fa1db..683e875 100644
--- a/tests/test_os.cpp
+++ b/tests/test_os.cpp
@@ -458,6 +458,25 @@ void TestProcess::testExec()
     CPPUNIT_ASSERT(execute("bladoesnotexist", StringVector()) != 0);
 }
 
+//
+// TestExecinfo
+//
+
+void TestExecinfo::testCppDemangle()
+{
+#ifdef __linux__
+    bool ok;
+    std::string result = execinfo::demangleCxxName("_ZN7QWidget8x11EventEP7_XEvent", &ok);
+    CPPUNIT_ASSERT(ok);
+    CPPUNIT_ASSERT_EQUAL(std::string("QWidget::x11Event(_XEvent*)"), result);
+#endif
+
+    // that must work on any platform
+    result = execinfo::demangleCxxName("blablubb", &ok);
+    CPPUNIT_ASSERT(!ok);
+    CPPUNIT_ASSERT_EQUAL(std::string("blablubb"), result);
+}
+
 }  // namespace os
 }  // namespace cs
 
diff --git a/tests/test_os.h b/tests/test_os.h
index 24e8984..a95d0a9 100644
--- a/tests/test_os.h
+++ b/tests/test_os.h
@@ -117,6 +117,17 @@ private:
     CPPUNIT_TEST_SUITE_END();
 };
 
+class TestExecinfo : public CppUnit::TestFixture
+{
+public:
+    void testCppDemangle();
+
+private:
+    CPPUNIT_TEST_SUITE(TestExecinfo);
+    CPPUNIT_TEST(testCppDemangle);
+    CPPUNIT_TEST_SUITE_END();
+};
+
 }  // namespace os
 }  // namespace cs
 
-- 
1.7.9.4


-- 
ptxdist mailing list
ptxdist@pengutronix.de

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [ptxdist] [PATCH 2/2] os: Add execinfo::backtrace()
  2012-03-22 12:49 [ptxdist] [PATCH 1/2] os: Add execinfo::demangleCxxName() bernhard
@ 2012-03-22 12:49 ` bernhard
  2012-03-22 12:54   ` Bernhard Walle
  0 siblings, 1 reply; 4+ messages in thread
From: bernhard @ 2012-03-22 12:49 UTC (permalink / raw)
  To: ptxdist; +Cc: Bernhard Walle

From: Bernhard Walle <walle@corscience.de>

Signed-off-by: Bernhard Walle <walle@corscience.de>
---
 NEWS                          |    2 +-
 csstdxx/CMakeLists.txt        |    2 ++
 csstdxx/os/execinfo.h         |   53 ++++++++++++++++++++++++++++++++++
 csstdxx/os/execinfo_linux.cpp |   64 +++++++++++++++++++++++++++++++++++++++++
 examples/os/CMakeLists.txt    |    4 +++
 examples/os/backtrace.cpp     |   27 +++++++++++++++++
 tests/test_os.cpp             |    7 +++++
 tests/test_os.h               |    2 ++
 8 files changed, 160 insertions(+), 1 deletion(-)
 create mode 100644 csstdxx/os/execinfo_linux.cpp
 create mode 100644 examples/os/backtrace.cpp

diff --git a/NEWS b/NEWS
index 752220a..213cda4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,6 @@
 0.5.1
 -----
- * os: Add execinfo::demangleCxxName().
+ * os: Add execinfo::demangleCxxName() and execinfo::backtrace().
 
 0.5.0
 -----
diff --git a/csstdxx/CMakeLists.txt b/csstdxx/CMakeLists.txt
index 71af070..d26c568 100644
--- a/csstdxx/CMakeLists.txt
+++ b/csstdxx/CMakeLists.txt
@@ -125,6 +125,8 @@ endif (WITH_SERIAL_BUS_ACCESS)
 
 if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
     set(CSSTDXX_SRC ${CSSTDXX_SRC}
+        os/execinfo_linux.cpp
+
         datetime/systemclock_linux.cpp
 
         io/iotimer_linux.cpp
diff --git a/csstdxx/os/execinfo.h b/csstdxx/os/execinfo.h
index 49cc21f..7772f4e 100644
--- a/csstdxx/os/execinfo.h
+++ b/csstdxx/os/execinfo.h
@@ -55,6 +55,59 @@ namespace execinfo {
  */
 std::string demangleCxxName(const char *name, bool *ok=NULL);
 
+/**
+ * \brief Returns a backtrace from the current stack
+ *
+ * It depends on the implementation how the backtrace looks like. Here's an example
+ * (x86_64, gcc, Linux):
+ *
+ * \verbatim
+/home/bwalle/devel/CSstdxx/CSstdxx/build/csstdxx/libcsstdxx.so.2(cs::os::execinfo::backtrace()+0x49) [0x7f8e7402594d]
+build/examples/os/backtrace(sigsegvhandler(int)+0x18) [0x400ccc]
+/lib/libc.so.6(+0x349f0) [0x7f8e72f819f0]
+build/examples/os/backtrace(foo(int)+0x1d) [0x400d2d]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(foo(int)+0x37) [0x400d47]
+build/examples/os/backtrace(main+0x28) [0x400d71]
+/lib/libc.so.6(__libc_start_main+0xed) [0x7f8e72f6e38d]
+build/examples/os/backtrace() [0x400bf9]
+\endverbatim
+ *
+ * As you see, the function names are demangled and there \b are function names.
+ * To get that on Linux/gcc, you must compile your application and all libraries
+ * from which a backtrace should be obtained with the <tt>-rdynamic</tt> command line
+ * parameter. This is the default for CMake.
+ *
+ * The example <tt>backtrace.cpp</tt> shows how to use backtrace to print something
+ * useful when the application receives a segmentation fault.
+ *
+ * \note Don't try to parse the output. Just use it for debugging.
+ *
+ * \return the backtrace as shown above on success or an empty string on failure.
+ * \since 0.5.1
+ * \ingroup os_execinfo
+ * \sa http://en.wikipedia.org/wiki/Name_mangling
+ */
+std::string backtrace();
+
 } // namespace execinfo
 } // namespace os
 } // namespace cs
diff --git a/csstdxx/os/execinfo_linux.cpp b/csstdxx/os/execinfo_linux.cpp
new file mode 100644
index 0000000..5516292
--- /dev/null
+++ b/csstdxx/os/execinfo_linux.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) Corscience GmbH & Co. KG
+ *
+ * Projectname - Redmine:CSstdxx
+ * Module ID - os
+ */
+
+#include <csstdxx/config.h>
+#include <cstdlib>
+#include <sstream>
+#include <execinfo.h>
+
+#include "execinfo.h"
+
+#ifdef HAVE_CXXABI_H
+#  include <cxxabi.h>
+#endif
+
+namespace cs {
+namespace os {
+namespace execinfo {
+
+#define BACKTRACE_MAX 100
+
+std::string backtrace()
+{
+    std::stringstream ss;
+
+    void *buffer[100];
+    int nptrs = ::backtrace(buffer, BACKTRACE_MAX);
+    if (nptrs == 0)
+        return std::string();
+
+    char **strings = backtrace_symbols(buffer, nptrs);
+    if (!strings)
+        return std::string();
+
+    for (int i = 0; i < nptrs; i++) {
+        // demangle names if possible
+        std::string line = strings[i];
+        size_t openBrace = line.find('(');
+        size_t plus = line.find('+', openBrace);
+
+        if ((openBrace == std::string::npos) || (plus == std::string::npos)) {
+            ss << line << std::endl;
+            continue;
+        }
+
+        std::string function = line.substr(openBrace+1, plus-openBrace-1);
+        function = demangleCxxName(function.c_str());
+
+        ss << line.substr(0, openBrace+1)
+           << function
+           << line.substr(plus) << std::endl;
+    }
+
+    free(strings);
+
+    return ss.str();
+}
+
+} // namespace execinfo
+} // namespace os
+} // namespace cs
diff --git a/examples/os/CMakeLists.txt b/examples/os/CMakeLists.txt
index e117fb7..4b20733 100644
--- a/examples/os/CMakeLists.txt
+++ b/examples/os/CMakeLists.txt
@@ -29,6 +29,10 @@ add_executable(c++filt c++filt.cpp)
 target_link_libraries(c++filt csstdxx)
 set(EXAMPLE_PROGRAMS ${EXAMPLE_PROGRAMS} c++filt)
 
+add_executable(backtrace backtrace.cpp)
+target_link_libraries(backtrace csstdxx)
+set(EXAMPLE_PROGRAMS ${EXAMPLE_PROGRAMS} backtrace)
+
 if (INSTALL_CSSTDXX_EXAMPLES)
     install(TARGETS ${EXAMPLE_PROGRAMS} DESTINATION bin/csstdxx)
 endif (INSTALL_CSSTDXX_EXAMPLES)
diff --git a/examples/os/backtrace.cpp b/examples/os/backtrace.cpp
new file mode 100644
index 0000000..ca6bd9d
--- /dev/null
+++ b/examples/os/backtrace.cpp
@@ -0,0 +1,27 @@
+#include <csignal>
+#include <cstdio>
+#include <csstdxx/os.h>
+
+void sigsegvhandler(int signal)
+{
+    puts(cs::os::execinfo::backtrace().c_str());
+    _exit(1);
+}
+
+int foo(int x)
+{
+    if (x == 0) {
+        volatile int *p = NULL;
+        *p = 20;
+        return 0;
+    }
+    else
+        return foo(x-1);
+}
+
+int main(int argc, char *argv[])
+{
+    signal(SIGSEGV, sigsegvhandler);
+    foo(20);
+    return 0;
+}
diff --git a/tests/test_os.cpp b/tests/test_os.cpp
index 683e875..c36e719 100644
--- a/tests/test_os.cpp
+++ b/tests/test_os.cpp
@@ -477,6 +477,13 @@ void TestExecinfo::testCppDemangle()
     CPPUNIT_ASSERT_EQUAL(std::string("blablubb"), result);
 }
 
+void TestExecinfo::testBacktrace()
+{
+#ifdef __linux__
+    CPPUNIT_ASSERT(!execinfo::backtrace().empty());
+#endif
+}
+
 }  // namespace os
 }  // namespace cs
 
diff --git a/tests/test_os.h b/tests/test_os.h
index a95d0a9..58ba5d3 100644
--- a/tests/test_os.h
+++ b/tests/test_os.h
@@ -121,10 +121,12 @@ class TestExecinfo : public CppUnit::TestFixture
 {
 public:
     void testCppDemangle();
+    void testBacktrace();
 
 private:
     CPPUNIT_TEST_SUITE(TestExecinfo);
     CPPUNIT_TEST(testCppDemangle);
+    CPPUNIT_TEST(testBacktrace);
     CPPUNIT_TEST_SUITE_END();
 };
 
-- 
1.7.9.4


-- 
ptxdist mailing list
ptxdist@pengutronix.de

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [ptxdist] [PATCH 2/2] os: Add execinfo::backtrace()
  2012-03-22 12:49 ` [ptxdist] [PATCH 2/2] os: Add execinfo::backtrace() bernhard
@ 2012-03-22 12:54   ` Bernhard Walle
  2012-03-24  9:53     ` Michael Olbrich
  0 siblings, 1 reply; 4+ messages in thread
From: Bernhard Walle @ 2012-03-22 12:54 UTC (permalink / raw)
  To: ptxdist

* bernhard@bwalle.de <bernhard@bwalle.de> [2012-03-22 13:49]:
> From: Bernhard Walle <walle@corscience.de>
> 
> Signed-off-by: Bernhard Walle <walle@corscience.de>

Sorry, that are patches that I wanted to post on an internal list.
Damn command line history. Should take some vacation...

Just ignore the mail.


Regards,
Bernhard

-- 
ptxdist mailing list
ptxdist@pengutronix.de

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [ptxdist] [PATCH 2/2] os: Add execinfo::backtrace()
  2012-03-22 12:54   ` Bernhard Walle
@ 2012-03-24  9:53     ` Michael Olbrich
  0 siblings, 0 replies; 4+ messages in thread
From: Michael Olbrich @ 2012-03-24  9:53 UTC (permalink / raw)
  To: ptxdist

On Thu, Mar 22, 2012 at 01:54:49PM +0100, Bernhard Walle wrote:
> * bernhard@bwalle.de <bernhard@bwalle.de> [2012-03-22 13:49]:
> > From: Bernhard Walle <walle@corscience.de>
> > 
> > Signed-off-by: Bernhard Walle <walle@corscience.de>
> 
> Sorry, that are patches that I wanted to post on an internal list.
> Damn command line history. Should take some vacation...

:-)

git config sendemail.to ptxdist@pengutronix.de

and the same for other repos. Then you don't need to specify the address.

Michael

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

-- 
ptxdist mailing list
ptxdist@pengutronix.de

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-03-24  9:53 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-22 12:49 [ptxdist] [PATCH 1/2] os: Add execinfo::demangleCxxName() bernhard
2012-03-22 12:49 ` [ptxdist] [PATCH 2/2] os: Add execinfo::backtrace() bernhard
2012-03-22 12:54   ` Bernhard Walle
2012-03-24  9:53     ` Michael Olbrich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox