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

Kostya Serebryany kcc at google.com
Wed Sep 4 23:44:38 PDT 2013


ah, thanks.


On Thu, Sep 5, 2013 at 9:40 AM, Reid Kleckner <rnk at google.com> wrote:

> 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/20130905/7de85748/attachment.html>


More information about the llvm-commits mailing list