> On July 27, 2014, 11:17 a.m., Thomas Lübking wrote:
> > drkonqi/gdbhighlighter.cpp, line 74
> > <https://git.reviewboard.kde.org/r/119498/diff/1/?file=293510#file293510line74>
> >
> >     an abort is not a crash ;-)
> >     
> >     If you hit this assert, the looked up (lineNr - 1) is somehow out of 
> > bounds, ie. there's no line with a key >= (lineNr -1) in the map.
> >     
> >     This should likely never happen on any system.
> >     Can you check what the lineNr actually is as compared to
> >     
> >        qDebug() << lineNr << lines.keys();
> >        
> >     ?
> 
> Ian Wadham wrote:
>     I did at one time have a few qDebug() statements to try and find what was 
> wrong with the algorithm. AFAICT it is trying to match one or more lines in 
> (const QString& text) with single (possibly long) lines of backtrace in 
> QMap<int, BacktraceLine>. I think it failed if one backtrace line was 
> formatted into three text lines or maybe if the last backtrace line was 
> formatted into two text lines. AFAICT (there is a real dearth of explanatory 
> comments) the code is merely introducing pretty colours, etc. into the 
> formatted text. As such, it should not abort Dr Konqi and lose the crash 
> report.
> 
> Thomas Lübking wrote:
>     Of course it should not crash.
>     
>     The point is that the assert explicitly tells you that there's something 
> wrong with the code.
>     Skippping it won't fix the issu - that's like puting duct tape over a 
> warning sign on your cars dashboard to fix "no cooling water".
>     
>     
>     Since the lines map seems only used to map lines to textblocks, i assume 
> the issue is that the lines are eg. not "\n" terminated in gdb output on OSX 
> (no idea, though) and the only item in the map is that for the key "0"
>     
>     In this case that'd be the issue to fix.
> 
> Ian Wadham wrote:
>     Please spare me the motoring analogies. To me, the ASSERT at this point, 
> is like bringing the car to a screeching halt or running it into the nearest 
> fence, simply because the glovebox light will not come on. I am a real-time 
> and O/S programmer from way back and have designed and written a few crash 
> procedures for different systems. They need to be rugged and simple (unlike 
> Dr Konqi IMHO) and to succeed no matter what. This used to be called failsafe 
> programming, graceful failure or graceful degradation. If an ASSERT and abort 
> technique has to be used in RT programming, to prevent potential database 
> corruption, it needs to be backed by an appropriate recovery and restart 
> procedure.
>     
>     Actually I think lines.end() is a legitimate return from 
> lines.lowerBound(lineNr - 1) in Dr K's algorithm (see 
> http://qt-project.org/doc/qt-5/qmap.html#lowerBound coding examples). The 
> lineNr can actually get ahead of the number of lines in the map by by too 
> much, if there are several multi-line entries in QString& text. Using an 
> ASSERT looks like lazy programming to me (Thinks: "I cannot see what to do in 
> this case, so I'll put in an ASSERT and see if it actually happens in 
> practice." ???). My solution is to re-use the last entry from the QMap. 
> Another might be to use "return;" instead of the ASSERT, leaving the last bit 
> of the highlighting incomplete, but not losing the valuable backtrace data.
>     
>     A better (more rugged) approach might be:
>     
>         get a line from "text"
>         if it is from the left-hand end of a backtrace entry (i.e. not a 
> continuation line)
>             get the next backtrace entry
>             if past last entry
>                 return
>         re-format the line from "text"
>     
>     I would have used something like that in my patch, but I do not know 
> enough about the format of backtrace data to get the first "if" condition 
> right. How would I?
>     
>     Re "\n" characters, they occur as expected in the content of "QString& 
> text" on Apple OS X.
> 
> RJVB Bertin wrote:
>     If it walks and talks like a crash ... we should not end up in the 
> discussion deadlock I once had with my boss who claimed embedded code cannot 
> crash (because there's no OS or whatelse to replace the application code).
>     
>     Anyway, I like Ian's suggestion to just return to the caller instead of 
> exitting (and I concur with his lazy programming analysis).
>     
>     So if I understood correctly, DrKonqi does some reformatting of the 
> backtrace before including it for upload with the bug report. What I haven't 
> understood is how important this reformatting is. Could it be a thought to 
> cancel the reformating procedure and return with the raw text, instead of 
> with a partly formated text, when the assert condition triggers?
>     
>     
>     About processing backtraces: recent OS X versions use lldb instead of 
> gdb. How have you tackled that, Ian - added a dependency on port:gdb ?
> 
> Aaron J. Seigo wrote:
>     This is not lazy programming but programming by contract. That it reaches 
> the lasT of lines is a bug... it should nEver happen algorithmic Ally. The 
> bug appears to be lowerbound sage. It returns the next higher kety and I bet 
> the orig dev assumed it would return the next lower. So... perhaps che k 
> forst for lines.contains and if that fails the do lowerbound--. That is just 
> from a quick read of the code. I am not familiar with this class nor do we 
> have output from the affected system which would be rather helpful.
> 
> RJVB Bertin wrote:
>     So the contractor was lazy, too lazy to specify how to handle this kind 
> of exception? ;)
>     
>     I suggested returning the raw text in part because it'd allow to upload 
> the offending output from affected systems ...
>     
>     (PS: Aaron, if you use an Android device for this kind of coding related 
> activities, you might want to turn off auto-correction and install the 
> Hacker's keyboard, 
> https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard)
> 
> Thomas Lübking wrote:
>     @Aaron, the author seemed aware of the lowerBound behavior, see original 
> lines 74ff
>     
>     
>     The issue:
>     -------------
>     The problem here is that the lines map is build from incoming strings.
>     The key indicates the linenumber of that string in \n metrics.
>     
>     If the last string starts at line i and has j > 1 lines (in terms of \n) 
> and the textDocument segments lines [i,i+j] into multiple lines, there's no 
> key >= i+k, 0 < k < j
>     
>     -> Therefore it is required to add a dummy element with the highest "l" 
> variable after the foreach loop in the constructor, so ::lowerBound will find 
> this and lines 74ff will lower the iterator.
>     This is different from assuming the ::end() iterator position to indicate 
> the post-last (what would be an option) in that it preserves the guarantee of 
> a sane lineNr.
>     
>     
>     
>     This is obviously not platform dependent, but a bug.
>     Asserts are there to detect bugs, throwing errors would probably be 
> nicer, but troublesome on Qt (not exception safe if you let the exception 
> escape to the eventloop)
>     
>     
>     On a general note:
>     -------------------
>     An assert on a logic condition is either wrong in general or there's 
> actually a bug. Therefore it's either removed or the bug fixed.
>     "Fixing" by ignoring unpredicted conditions on "random" circumstances 
> (and the platform /is/ random in this regard) is completely unacceptable as 
> far as I am concerned.
>     
>     If a module causes trouble and you're running out of time it's of course 
> ok to skip the module and schedule the fix, but ignoring a conflict instead 
> of analyzing it is what /I/ was tought to consider lazy :-P
>     
>     PS:
>     ----
>     The duct tape was btw. a reference to the Simpsons - generation gap, i 
> assume ;-)
> 
> Ian Wadham wrote:
>     @Aaron: Welcome aboard! I think it must be Akademy 2008 in Belgium since 
> we last met. Nice to meet you again :-)
>     I have attached a log file containing (immediately before the ASSERT), 
> (lineNr - 1), it.key() and an abbreviation of the "text" line being processed.
>     
>     @René: Be careful who you are giving advice to... Aaron is leader of the 
> Plasma project :-)
>     
>     @Thomas: My sons used to watch the Simpsons. So did I, but not that 
> regularly. I was more into Buffy the Vampire Slayer :-)
>     
>     The ASSERT failure is definitely when the last backtrace entry has > 1 
> line. See the attached file. I think adding a dummy line may be the best 
> solution. I still do not like using ASSERT and abort and losing the 
> backtrace. How about doing the same test and adding a warning message to the 
> outgoing backtrace text if there is any problem? Graceful failure... :-)
> 
> Thomas Lübking wrote:
>     Usually an assert here would be perfectly fine, since it indicates an 
> unpredicted (implying "invalid" in this context) state, asserts only apply 
> when compiling in debug mode and since there's a bug, it's ok to take a core 
> dump and cause a bugreport.
>     
>     In the very specific context of DrKonqi however, i tend to agree that 
> aborting the crash dialog is better to be avoided in any possible case.
>     I'd suggest to have a QMessageBox (telling the poor soul it just hit two 
> bugs for one and how to report the second one) and immediately return in the 
> particular case.
>     
>     This is however up to DrKonqi maintainers (there multiple Q_ASSERT 
> calls), maybe explicitly attach Milian to this review.
> 
> Ian Wadham wrote:
>     @René: RE "About processing backtraces: recent OS X versions use lldb 
> instead of gdb. How have you tackled that, Ian - added a dependency on 
> port:gdb ?"
>     
>     I haven't "tackled" it. Have a heart! But I have just established that 
> DrKonqi can accept various debuggers via KConfig files (*rc) in 
> share/apps/drkonqi/debuggers/internal (or .../external). I know nothing about 
> either lldb or gdb - I never use interactive debuggers as a rule. If they are 
> sufficiently compatible with each other, maybe someone could write a DrKonqi 
> config file for lldb. At present, DrKonqi's options are dbx, gdb and 
> kdbgwinrc (for Windows). Or maybe MacPorts could keep gdb around "forever", 
> as it does for other things that Apple OS X drops.

@Thomas: Yes, you just redescribed exactly what I did :) If the last line has 
more than 1 line, then it needs to not pick the NEXT member of lines, which is 
what lowerBound does, but lowerBound(key)--. Looking at the code, it seems this 
holds for all multi-line entries. So at least the fix looks easy enough: if it 
hits the end, then it needs to back the iterator up by one. A multi-line entry 
in the middle of the output should also be tested just to be certain it works 
as expected there (I suspect not)


- Aaron J.


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


On July 30, 2014, 1:04 p.m., Ian Wadham wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/119498/
> -----------------------------------------------------------
> 
> (Updated July 30, 2014, 1:04 p.m.)
> 
> 
> Review request for KDE Software on Mac OS X, KDE Runtime, kdelibs, and 
> Michael Pyne.
> 
> 
> Repository: kde-runtime
> 
> 
> Description
> -------
> 
> When a KDE app crashes in Apple OS X, it just disappears from the screen. At 
> the most, the user is invited to report the crash to Apple. AFAIK this has 
> been a problem in KDE on Apple OS X for years, leading to frustration with 
> KDE among Apple users and MacPorts developers and an attitude among KDE 
> developers of "Why does nobody report the problem(s) on bugs.kde.org?"
> 
> It is my strong belief that the failure to report crashes of KDE apps in 
> Apple OS X also exists in Frameworks.
> 
> So far I have identified a number of portability bugs in KDE on Apple OS X: 1 
> in KCrash, 1 in kdeinit4 and 5 in Dr Konqi. Three patches for Dr Konqi are 
> submitted in this review. Patches for KCrash and kdeinit4 are submitted in 
> part 1 of this review, against kdelibs. I am still investigating the other 
> two problems in Dr Konqi - and there could be more than two...
> 
> In this review we have three portability problems:
> 
> 1. On Apple OS X, Dr Konqi's dialog box hides itself underneath the main 
> window of the app that has just crashed, so is effectively useless. This 
> appears to be because Dr Konqi is started by a Linux/Unix method (fork() + 
> exec()?). If an app is started with the Apple OS X "open" command, it always 
> appears on top. The patch just raises the dialog box.
> 
> 2. When formatting the backtrace output, Dr Konqi crashes (with an ASSERT) on 
> the last line. This appears to be an error in the algorithm used (i.e. also a 
> bug in Linux KDE), but the patch is treating it as an Apple OS X portability 
> problem for now.
> 
> 3. Dr Konqi checks whether the user can save cookies in kcookiejar and, if 
> not, stops reporting the crash. On Apple OS X, cookies would be kept in 
> another browser (e.g. Safari or Firefox) and not in KDE's default browser 
> (Konqueror) and cookie jar. IMHO, Dr K should report the crash no matter 
> what, as long as it can connect to bugs.kde.org and log in.
> 
> 
> Diffs
> -----
> 
>   drkonqi/reportassistantpages_bugzilla.cpp 86ca327 
>   drkonqi/gdbhighlighter.cpp 7cd0aa9 
>   drkonqi/main.cpp 75e060e 
> 
> Diff: https://git.reviewboard.kde.org/r/119498/diff/
> 
> 
> Testing
> -------
> 
> Using Apple OS X 10.7.5 (Lion) on a MacBook Pro, I have installed KDE libs 
> via MacPorts (at version 4.12.5) and I have adapted kdesrc-build to run in an 
> Apple OS X environment and used it to test against the KDE 4.13 branch. I 
> have been testing with a KDE app that I can crash at will and using stderr 
> and Apple OS X Console log output to determine the outcome.
> 
> Please note that I am the -only- KDE developer who has this kind of setup, 
> but I am NOT a KDE core developer. My experience before now has been in KDE 
> Games. However I used to be a UNIX and database guru before I retired in 1998.
> 
> I NEED HELP from KDE -core- developers to proceed further. These problems 
> will also exist in Dr Konqi for KF 5, but I am as yet unable to build or test 
> Frameworks on Apple OS X and I cannot find Dr Konqi among the Frameworks 
> repositories. I am sure there are many more Apple OS X portability problems 
> in Dr Konqi and other KDE software.
> 
> Without my patches, Dr Konqi, on Apple OS X, remains invisible to the user, 
> often fails to complete the backtrace report and then fails to connect to 
> bugs.kde.org.
> 
> With my patches, Dr Konqi on Apple OS X can generate a full crash report, 
> including the backtrace and the results of the dialog with the user. 
> Sometimes, however, it fails to submit the completed report to bugs.kde.org. 
> This problem is still under investigation.
> 
> I would not have got this far without help from Michael Pyne, Thomas Lübking 
> and several of the MacPorts developers, as well as the unfailing enthusiasm 
> and encouragement of my friend Marko Käning.
> 
> 
> File Attachments
> ----------------
> 
> Log of Dr K ASSERT problem
>   
> https://git.reviewboard.kde.org/media/uploaded/files/2014/07/30/a3f99f00-94df-4b10-bc47-66b1c966f893__DrKonqiASSERT.kcrash.txt
> 
> 
> Thanks,
> 
> Ian Wadham
> 
>

Reply via email to