[cfe-commits] PATCH: Add diagnostic output for crash reports
Douglas Gregor
dgregor at apple.com
Wed Jul 13 14:38:54 PDT 2011
Hi Chad,
On Jul 13, 2011, at 2:07 PM, Chad Rosier wrote:
> This patch adds support for producing additional diagnostic information upon a clang crash. Specifically, the compile is rerun to generate preprocessed source and a message is emitted showing all the command-line options needed to reproduce the problem. The user is asked to submit a radar/bug report and attach this additional information. Also, I tested things by hard coding the verifier pass to fail, but I was hoping someone could suggest a more robust means of testing prior to committing.
Making Clang crash for testing purposes is *easy* :)
#pragma clang __debug crash
> This is for <rdar://problem/9575623>.
Thanks for working on this! Some comments:
Index: include/clang/Driver/Compilation.h
===================================================================
--- include/clang/Driver/Compilation.h (revision 135078)
+++ include/clang/Driver/Compilation.h (working copy)
@@ -14,6 +14,7 @@
#include "clang/Driver/Util.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/Support/Path.h"
namespace llvm {
class raw_ostream;
@@ -60,6 +61,9 @@
/// Result files which should be removed on failure.
ArgStringList ResultFiles;
+ /// Redirection for stdout, stderr, etc.
+ const llvm::sys::Path **Redirects;
+
public:
Compilation(const Driver &D, const ToolChain &DefaultToolChain,
InputArgList *Args, DerivedArgList *TranslatedArgs);
@@ -84,7 +88,7 @@
const ArgStringList &getTempFiles() const { return TempFiles; }
const ArgStringList &getResultFiles() const { return ResultFiles; }
-
+
/// getArgsForToolChain - Return the derived argument list for the
/// tool chain \arg TC (or the default tool chain, if TC is not
/// specified).
@@ -136,6 +140,11 @@
/// Command which failed.
/// \return The accumulated result code of the job.
int ExecuteJob(const Job &J, const Command *&FailingCommand) const;
+
+ /// initCompilationForDiagnostics - Remove stale state and supress output
+ /// so compilation can be reexecuted to generate additional diagnostic
+ /// information (e.g., preprocessed source).
Typo "supress".
-int Driver::ExecuteCompilation(const Compilation &C) const {
+// When clang crashes, produce diagnostic information including the fully
+// preprocessed source file and relevant command line arguments. Request
+// that the developer attach the diagnostic information to a radar.
+void Driver::generateCompilationDiagnostics(Compilation &C,
+ const Command *FailingCommand) {
+ llvm::errs() << "\nCompilation error detected, generating diagnostic "
+ << "information including preprocessed source code and "
+ << "relevant command line arguments. Please submit a "
+ << "radar/bugzilla and include all diagnostic information.\n";
A few comments here.:
- This should use the driver's diagnostics engine, rather than printing directly via llvm::errs()
- The diagnostic emitted should be customized via something passed to "configure" so vendors of different Clang-based compilers can send people to different URLs to file bugs. The default llvm.org Clang should people to file a bug report at http://llvm.org/, but Apple/Google/whoever will want to customize that URL for the compilers they use.
Did you check how well this works when the crash occurs in a translation unit that uses a precompiled header? We'd like to make sure that we're actually going to get useful data in that case.
- Doug
More information about the cfe-commits
mailing list