[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