> On Nov. 23, 2014, 12:20 a.m., Thomas Lübking wrote:
> > kdecore/io/kdebug.cpp, line 717
> > <https://git.reviewboard.kde.org/r/121213/diff/1/?file=329504#file329504line717>
> >
> >     Why do you need to sharpen the match?
> 
> René J.V. Bertin wrote:
>     Because otherwise the symbol to be demangled is left with a trailing 
> space, which causes the demangle to fail. Wanna know how I know?
> 
> Thomas Lübking wrote:
>     Don't know about the GCC behavior on trailing spaces, but one should 
> probably have some "while (in.at(mangledNameEnd) == ' ') --mangledNameEnd;" 
> loop?
> 
> René J.V. Bertin wrote:
>     One could, but why? The start is found with a string, I don't see why the 
> end wouldn't be, given that that loop of yours will always loop just once ...
> 
> Thomas Lübking wrote:
>     ... or not at all or thrice - depending on how the mangler feels today.
>     
>     What I mean is that if untrimmed strings are a problem for demangling, 
> one should seek to get rid of all the whitespace generically - i don't care 
> about whether seeking for a string or char, this context is hardly 
> performance critical.
> 
> René J.V. Bertin wrote:
>     this particular bit of whitespace has nothing to do with the mangler or 
> how it feels today. It's formatting done by the backtrace function, which 
> clearly always puts a space-padded `+` rather than one without padding as 
> under Linux.
>     Frankly, in general I'd agree with you, but here I don't see any reason 
> to make the code more complex than it is.
> 
> Thomas Lübking wrote:
>     backtrace() is provided by glibc resp. the apple (darwin) libc (i hope).
>     -> What provides /usr/include/execinfo.h on OSX?
>     That's what is needed to be detected (I assume this would affect *all* 
> BSD variants?)
>     
>     > I don't see any reason to make the code more complex than it is.
>     
>     If we're dealing w/ unspecified output and need to sanitize it, we may 
> have to do this generically if we must consider random toolchains aside 
> gcc+glibc.
>     I know that you only care about OSX, but actually OSX is just a good 
> testcase to see whether the code is "correct" or just happens to work.
>     
>     - Do you compile with gcc or clang?
>     - Did you check whether the glibc backtrace() output is actually stripped?
>     - What if we compile glibc w/ llvm and glibc backtrace() fires padded " + 
> " which llvm __cxa_demangle() cannot handle? (ok, rethorical question ;-)

> backtrace() is provided by glibc resp. the apple (darwin) libc (i hope).

Not that we have something called libc on OS X, but I think that just 
underlines my point. The C Library is more part of the system than it is of the 
C "package", so the only check on compiler that would make sense IMHO is on the 
system compiler, as far as that's possible (like the Apple-provided 
__APPLE_CC__).

> What provides /usr/include/execinfo.h on OSX?

If you're talking about packages: either the standard install, or Xcode and/or 
"Command Line Tools".
One shouldn't take OS X as a guideline for any BSD variant, it might even have 
diverged too much to use BSD as a guideline for what ought to work on OS X.

I agree about the sanitising/generalising, which is why I pulled the 
suppression of trailing whitespace out of the end token search (and you'll 
notice I don't just suppress spaces). I just don't think it'd make any sense to 
have a os/toolchain-specific constant and then the actual search one-liner. 
Just put that search statement in the conditional block and be done with it.

This patch has currently been tested only on 10.9(.4), which means I can 
basically only test with clang. I can affirm though that the existing code 
doesn't demangle on 10.6 either, whether I use clang or gcc.

> Did you check whether the glibc backtrace() output is actually stripped?

I don't understand the question?

This is what unparsed output from backtrace_symbols looks like (even adding the 
counter: isn't required):

```
0: "0   libkdecore.5.dylib                  0x0000000106656f71 
_Z14kRealBacktracei + 81"
1: "1   kwindowtest                         0x0000000105e322e1 
_ZN10TestWindow8slotOpenEv + 2753"
2: "2   kwindowtest                         0x0000000105e33d68 
_ZN10TestWindow18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv + 184"
3: "3   QtCore                              0x0000000106c8d3fd 
_ZN11QMetaObject8activateEP7QObjectPKS_iPPv + 1693"
4: "4   QtGui                               0x0000000106faf419 
_ZN7QAction8activateENS_11ActionEventE + 233"
5: "5   QtGui                               0x00000001073141e4 
_ZN22QAbstractButtonPrivate5clickEv + 84"
6: "6   QtGui                               0x0000000107314fc8 
_ZN15QAbstractButton17mouseReleaseEventEP11QMouseEvent + 88"
7: "7   QtGui                               0x00000001073db67f 
_ZN11QToolButton17mouseReleaseEventEP11QMouseEvent + 15"
8: "8   QtGui                               0x00000001070069bd 
_ZN7QWidget5eventEP6QEvent + 717"
9: "9   QtGui                               0x0000000107314ed4 
_ZN15QAbstractButton5eventEP6QEvent + 180"
10: "10  QtGui                               0x00000001073dbb2a 
_ZN11QToolButton5eventEP6QEvent + 170"
11: "11  QtGui                               0x0000000106fb840c 
_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 252"
12: "12  QtGui                               0x0000000106fba357 
_ZN12QApplication6notifyEP7QObjectP6QEvent + 2919"
13: "13  QtCore                              0x0000000106c75516 
_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent + 118"
14: "14  QtGui                               0x0000000106fb8df6 
_ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb
 + 470"
15: "15  QtGui                               0x0000000106f67a2a 
_Z23qt_mac_handleMouseEventP7NSEventN6QEvent4TypeEN2Qt11MouseButtonEP7QWidgetb 
+ 922"
16: "16  AppKit                              0x00007fff9491f145 -[NSWindow 
sendEvent:] + 781"
17: "17  QtGui                               0x0000000106f5f2f1 -[QCocoaWindow 
sendEvent:] + 113"
18: "18  AppKit                              0x00007fff948c05d4 -[NSApplication 
sendEvent:] + 2021"
19: "19  QtGui                               0x0000000106f640fe 
-[QNSApplication sendEvent:] + 78"
20: "20  AppKit                              0x00007fff947109f9 -[NSApplication 
run] + 646"
21: "21  QtGui                               0x0000000106f6cba0 
_ZN19QEventDispatcherMac13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE
 + 528"
22: "22  QtCore                              0x0000000106c728ad 
_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE + 477"
23: "23  QtCore                              0x0000000106c75ac7 
_ZN16QCoreApplication4execEv + 199"
24: "24  kwindowtest                         0x0000000105e33bdc main + 316"
25: "25  libdyld.dylib                       0x00007fff93bb75fd start + 1"
26: "26  ???                                 0x0000000000000002 0x0 + 2"
```

which is converted to:

```
0: 0   libkdecore.5.dylib                  0x0000000106656f71 
kRealBacktrace(int) + 81
1: 1   kwindowtest                         0x0000000105e322e1 
TestWindow::slotOpen() + 2753
2: 2   kwindowtest                         0x0000000105e33d68 
TestWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 184
3: 3   QtCore                              0x0000000106c8d3fd 
QMetaObject::activate(QObject*, QMetaObject const*, int, void**) + 1693
4: 4   QtGui                               0x0000000106faf419 
QAction::activate(QAction::ActionEvent) + 233
5: 5   QtGui                               0x00000001073141e4 
QAbstractButtonPrivate::click() + 84
6: 6   QtGui                               0x0000000107314fc8 
QAbstractButton::mouseReleaseEvent(QMouseEvent*) + 88
7: 7   QtGui                               0x00000001073db67f 
QToolButton::mouseReleaseEvent(QMouseEvent*) + 15
8: 8   QtGui                               0x00000001070069bd 
QWidget::event(QEvent*) + 717
9: 9   QtGui                               0x0000000107314ed4 
QAbstractButton::event(QEvent*) + 180
10: 10  QtGui                               0x00000001073dbb2a 
QToolButton::event(QEvent*) + 170
11: 11  QtGui                               0x0000000106fb840c 
QApplicationPrivate::notify_helper(QObject*, QEvent*) + 252
12: 12  QtGui                               0x0000000106fba357 
QApplication::notify(QObject*, QEvent*) + 2919
13: 13  QtCore                              0x0000000106c75516 
QCoreApplication::notifyInternal(QObject*, QEvent*) + 118
14: 14  QtGui                               0x0000000106fb8df6 
QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, 
QWidget**, QPointer<QWidget>&, bool) + 470
15: 15  QtGui                               0x0000000106f67a2a 
qt_mac_handleMouseEvent(NSEvent*, QEvent::Type, Qt::MouseButton, QWidget*, 
bool) + 922
16: 16  AppKit                              0x00007fff9491f145 -[NSWindow 
sendEvent:] + 781
17: 17  QtGui                               0x0000000106f5f2f1 -[QCocoaWindow 
sendEvent:] + 113
18: 18  AppKit                              0x00007fff948c05d4 -[NSApplication 
sendEvent:] + 2021
19: 19  QtGui                               0x0000000106f640fe -[QNSApplication 
sendEvent:] + 78
20: 20  AppKit                              0x00007fff947109f9 -[NSApplication 
run] + 646
21: 21  QtGui                               0x0000000106f6cba0 
QEventDispatcherMac::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 528
22: 22  QtCore                              0x0000000106c728ad 
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 477
23: 23  QtCore                              0x0000000106c75ac7 
QCoreApplication::exec() + 199
24: 24  kwindowtest                         0x0000000105e33bdc main + 316
25: 25  libdyld.dylib                       0x00007fff93bb75fd start + 1
26: 26  ???                                 0x0000000000000002 0x0 + 2
```


- René J.V.


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/121213/#review70796
-----------------------------------------------------------


On Nov. 24, 2014, 7:37 p.m., René J.V. Bertin wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/121213/
> -----------------------------------------------------------
> 
> (Updated Nov. 24, 2014, 7:37 p.m.)
> 
> 
> Review request for KDE Software on Mac OS X and kdelibs.
> 
> 
> Repository: kdelibs
> 
> 
> Description
> -------
> 
> This patch adapts the parser in `maybeDemangledName` to the backtrace 
> obtained in `kRealBacktrace` on OS X.
> 
> 
> Diffs
> -----
> 
>   kdecore/io/kdebug.cpp 872a05a 
> 
> Diff: https://git.reviewboard.kde.org/r/121213/diff/
> 
> 
> Testing
> -------
> 
> Works as expected on OS X 10.9.4 .
> 
> 
> Thanks,
> 
> René J.V. Bertin
> 
>

Reply via email to