rjvbb added a comment.

  Actually, it's even worse than that: I didn't double-check my assumptions 
about the use of DrKonqi's return/exit code. Looking at the code again there is 
actually no way that information is even obtained. The `startProcess` function 
simply starts DrKonqi and then waits for it to exit if so instructed; the only 
information obtained about the crashreporter is its PID.
  
  And indeed, DrKonqi exits with 0 for me too when I cancel/close it.
  
  In a way this is worse not just because my brain was cooked yesterday. It 
means we're getting different behaviour inside KCrash: the value of 
`crashRecursionCounter`. And I'm back to not understanding how that's possible. 
I don't see how `crashRecursionCounter` could ever be `>2` unless you attempt 
to restart the crashed application. But that also doesn't work for me: it 
starts a new application = new PID = `crashRecursionCounter` never increases.
  
  That counter gets set to 2 here:
  
    if (crashRecursionCounter < 2) {
        if (s_emergencySaveFunction) {
            s_emergencySaveFunction(sig);
        }
        if ((s_flags & AutoRestart) && s_autoRestartCommand) {
            QThread::sleep(1);
            startProcess(s_autoRestartArgc, const_cast<const char 
**>(s_autoRestartCommandLine), false);
        }
        crashRecursionCounter++;
    }
  
  A bit strange that the counter would always be increased and not only when 
there has been an auto-restart attempt, but let's ignore that for now.
  
  I see no other places where the counter is increased, so apparently the code 
assumes that the function itself can be called multiple times. But how? I see 
only 2 possibilities:
  
  - When the application receives an additional signal that is connected to the 
`defaultCrashHandler()` function
  - When the application is restarted without changing its PID and without 
re-initialising all its static variables - is that even possible (after a fatal 
exception)?
  
  In other words, how do you get the `crashRecursionCounter >= 4` required for 
not printing the unable-to-start warning?
  
  Answer: you never get to that check:
  
    if (!s_coreConfig->isProcess()) {
        // Only exit if we don't forward to core dumps
        _exit(253);
    }
  
  On my system:
  
    %> cat /proc/sys/kernel/core_pattern
    |/usr/share/apport/apport %p %s %c %P
  
  Q.E.D. ...

REPOSITORY
  R285 KCrash

REVISION DETAIL
  https://phabricator.kde.org/D14606

To: rjvbb, #frameworks, sitter
Cc: dfaure, kde-frameworks-devel, michaelh, ngraham, bruns

Reply via email to