[compiler-rt] r190030 - sanitizers: Make sure Visual Studio gets error reports

Reid Kleckner rnk at google.com
Wed Sep 4 22:40:35 PDT 2013


On Wed, Sep 4, 2013 at 9:53 PM, Kostya Serebryany <kcc at google.com> wrote:

>
>
>
> On Thu, Sep 5, 2013 at 7:19 AM, Reid Kleckner <reid at kleckner.net> wrote:
>
>> Author: rnk
>> Date: Wed Sep  4 22:19:57 2013
>> New Revision: 190030
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=190030&view=rev
>> Log:
>> sanitizers: Make sure Visual Studio gets error reports
>>
>> Visual Studio appears to close stderr before launching a non-console
>> win32 program.  This means we don't see any sanitizer reports.  If
>> stderr printing fails, call OutputDebugStringA to get the reports into
>> the Visual Studio debugger console.
>>
>> Modified:
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc
>>     compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc?rev=190030&r1=190029&r2=190030&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.cc Wed Sep  4
>> 22:19:57 2013
>> @@ -26,16 +26,19 @@ uptr GetPageSizeCached() {
>>    return PageSize;
>>  }
>>
>> -static bool log_to_file = false;  // Set to true by
>> __sanitizer_set_report_path
>>
>>  // By default, dump to stderr. If |log_to_file| is true and
>> |report_fd_pid|
>>  // isn't equal to the current PID, try to obtain file descriptor by
>> opening
>>  // file "report_path_prefix.<PID>".
>>  fd_t report_fd = kStderrFd;
>> -static char report_path_prefix[4096];  // Set via
>> __sanitizer_set_report_path.
>> +
>> +// Set via __sanitizer_set_report_path.
>> +bool log_to_file = false;
>> +char report_path_prefix[sizeof(report_path_prefix)];
>>
>
> hmm. What is
>    char X[sizeof(X)]
> supposed to mean?
>

Trying to take the size of X from the header file.  It will fail if X is
not available.

The alternative is:
.h:
enum { kBufferSize = 4096 };
extern char X[kBufferSize];
.cpp:
char X[kBufferSize];


> also, I am not a great fan of non-static globals, even in a namespace.
>
>
>
>> +
>>  // PID of process that opened |report_fd|. If a fork() occurs, the PID
>> of the
>>  // child thread will be different from |report_fd_pid|.
>> -static uptr report_fd_pid = 0;
>> +uptr report_fd_pid = 0;
>>
>>  static DieCallbackType DieCallback;
>>  void SetDieCallback(DieCallbackType callback) {
>> @@ -68,36 +71,6 @@ void NORETURN CheckFailed(const char *fi
>>    Die();
>>  }
>>
>> -void MaybeOpenReportFile() {
>> -  if (!log_to_file || (report_fd_pid == internal_getpid())) return;
>> -  InternalScopedBuffer<char> report_path_full(4096);
>> -  internal_snprintf(report_path_full.data(), report_path_full.size(),
>> -                    "%s.%d", report_path_prefix, internal_getpid());
>> -  uptr openrv = OpenFile(report_path_full.data(), true);
>> -  if (internal_iserror(openrv)) {
>> -    report_fd = kStderrFd;
>> -    log_to_file = false;
>> -    Report("ERROR: Can't open file: %s\n", report_path_full.data());
>> -    Die();
>> -  }
>> -  if (report_fd != kInvalidFd) {
>> -    // We're in the child. Close the parent's log.
>> -    internal_close(report_fd);
>> -  }
>> -  report_fd = openrv;
>> -  report_fd_pid = internal_getpid();
>> -}
>> -
>> -void RawWrite(const char *buffer) {
>> -  static const char *kRawWriteError = "RawWrite can't output requested
>> buffer!";
>> -  uptr length = (uptr)internal_strlen(buffer);
>> -  MaybeOpenReportFile();
>> -  if (length != internal_write(report_fd, buffer, length)) {
>> -    internal_write(report_fd, kRawWriteError,
>> internal_strlen(kRawWriteError));
>> -    Die();
>> -  }
>> -}
>> -
>>  uptr ReadFileToBuffer(const char *file_name, char **buff,
>>                        uptr *buff_size, uptr max_len) {
>>    uptr PageSize = GetPageSizeCached();
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=190030&r1=190029&r2=190030&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Wed Sep  4
>> 22:19:57 2013
>> @@ -116,6 +116,9 @@ void SetPrintfAndReportCallback(void (*c
>>  extern StaticSpinMutex CommonSanitizerReportMutex;
>>  void MaybeOpenReportFile();
>>  extern fd_t report_fd;
>> +extern bool log_to_file;
>> +extern char report_path_prefix[4096];
>> +extern uptr report_fd_pid;
>>
>>  uptr OpenFile(const char *filename, bool write);
>>  // Opens the file 'file_name" and reads up to 'max_len' bytes.
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc?rev=190030&r1=190029&r2=190030&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_posix.cc Wed Sep  4
>> 22:19:57 2013
>> @@ -197,6 +197,37 @@ char *FindPathToBinary(const char *name)
>>    return 0;
>>  }
>>
>> +void MaybeOpenReportFile() {
>> +  if (!log_to_file || (report_fd_pid == internal_getpid())) return;
>> +  InternalScopedBuffer<char> report_path_full(4096);
>> +  internal_snprintf(report_path_full.data(), report_path_full.size(),
>> +                    "%s.%d", report_path_prefix, internal_getpid());
>> +  uptr openrv = OpenFile(report_path_full.data(), true);
>> +  if (internal_iserror(openrv)) {
>> +    report_fd = kStderrFd;
>> +    log_to_file = false;
>> +    Report("ERROR: Can't open file: %s\n", report_path_full.data());
>> +    Die();
>> +  }
>> +  if (report_fd != kInvalidFd) {
>> +    // We're in the child. Close the parent's log.
>> +    internal_close(report_fd);
>> +  }
>> +  report_fd = openrv;
>> +  report_fd_pid = internal_getpid();
>> +}
>> +
>> +void RawWrite(const char *buffer) {
>> +  static const char *kRawWriteError =
>> +      "RawWrite can't output requested buffer!\n";
>> +  uptr length = (uptr)internal_strlen(buffer);
>> +  MaybeOpenReportFile();
>> +  if (length != internal_write(report_fd, buffer, length)) {
>> +    internal_write(report_fd, kRawWriteError,
>> internal_strlen(kRawWriteError));
>> +    Die();
>> +  }
>> +}
>> +
>>  }  // namespace __sanitizer
>>
>>  #endif  // SANITIZER_LINUX || SANITIZER_MAC
>>
>> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc?rev=190030&r1=190029&r2=190030&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc (original)
>> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_win.cc Wed Sep  4
>> 22:19:57 2013
>> @@ -398,6 +398,24 @@ void GetStackTrace(StackTrace *stack, up
>>      stack->trace[i] = (uptr)tmp[i + offset];
>>  }
>>
>> +void MaybeOpenReportFile() {
>> +  // Windows doesn't have native fork, and we don't support Cygwin or
>> other
>> +  // environments that try to fake it, so the initial report_fd will
>> always be
>> +  // correct.
>> +}
>> +
>> +void RawWrite(const char *buffer) {
>> +  static const char *kRawWriteError =
>> +      "RawWrite can't output requested buffer!\n";
>> +  uptr length = (uptr)internal_strlen(buffer);
>> +  if (length != internal_write(report_fd, buffer, length)) {
>> +    // stderr may be closed, but we may be able to print to the debugger
>> +    // instead.  This is the case when launching a program from Visual
>> Studio,
>> +    // and the following routine should write to its console.
>> +    OutputDebugStringA(buffer);
>> +  }
>> +}
>> +
>>  }  // namespace __sanitizer
>>
>>  #endif  // _WIN32
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130904/08f6df9f/attachment.html>


More information about the llvm-commits mailing list