Google Breakpad Fix

master
Graham Madarasz (Graham Linden) 2013-03-28 19:25:51 -07:00
parent 14ddfcdf52
commit 903996e8d4
8 changed files with 78 additions and 25 deletions

View File

@ -606,9 +606,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>9f8a9dc39fd7c3da0fb3533782d1fddf</string>
<string>bd6f84f9fb3c2e68850676d06935373f</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/226814/arch/Linux/installer/freetype-2.3.9-linux-20110418.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-freetype/rev/271684/arch/Linux/installer/freetype-2.4.4-linux-20130312.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -761,10 +761,10 @@
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>21babc394dbf8572830f2e85adec7b9f</string>
<key>url</key>
<string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20110202.tar.bz2</string>
<key>hash</key>
<string>79976b2f93ec5716709b752483ffa04a</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273021/arch/Darwin/installer/google_breakpad-0.0.0-rev1099-darwin-20130328.tar.bz2</string>
</map>
<key>name</key>
<string>darwin</string>
@ -773,10 +773,10 @@
<map>
<key>archive</key>
<map>
<key>hash</key>
<string>204b02a9480c411232255798839431a2</string>
<key>url</key>
<string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20110311.tar.bz2</string>
<key>hash</key>
<string>1df1bb19a43a2d1a684ce9d4da9dc7bc</string>
<key>url</key>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273021/arch/Linux/installer/google_breakpad-0.0.0-rev1099-linux-20130328.tar.bz2</string>
</map>
<key>name</key>
<string>linux</string>
@ -786,9 +786,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>627c51136e14e64c5d39933f3abd3bdf</string>
<string>cfd02d75dbd55327de71db81dc8a3f41</string>
<key>url</key>
<string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-windows-20110218.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-breakpad/rev/273021/arch/CYGWIN/installer/google_breakpad-0.0.0-rev1099-windows-20130328.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -834,9 +834,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>212701468920519f3989677cea9ca4f1</string>
<string>98994d5b0b4b3d43be22aa6a5c36e6fa</string>
<key>url</key>
<string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gmock-1.5.0-windows-20110224.tar.bz2</string>
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-google-mock-graham/rev/272961/arch/CYGWIN/installer/gmock-1.6.0-windows-20130327.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>

View File

@ -260,7 +260,6 @@ elseif(LINUX)
libboost_filesystem-mt.so.${BOOST_VERSION}.0
libboost_signals-mt.so.${BOOST_VERSION}.0
libboost_system-mt.so.${BOOST_VERSION}.0
libbreakpad_client.so.0
libcollada14dom.so
libcrypto.so.1.0.0
libdb-5.1.so

View File

@ -7,13 +7,7 @@ if (STANDALONE)
pkg_check_modules(FREETYPE REQUIRED freetype2)
else (STANDALONE)
use_prebuilt_binary(freetype)
if (LINUX)
set(FREETYPE_INCLUDE_DIRS
${LIBS_PREBUILT_DIR}/include)
else (LINUX)
set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (LINUX)
set(FREETYPE_LIBRARIES freetype)
endif (STANDALONE)

View File

@ -15,5 +15,8 @@ else (STANDALONE)
if (WINDOWS)
set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client common)
endif (WINDOWS)
# yes, this does look dumb, no, it's not incorrect
#
set(BREAKPAD_INCLUDE_DIRECTORIES "${LIBS_PREBUILT_DIR}/include/google_breakpad" "${LIBS_PREBUILT_DIR}/include/google_breakpad/google_breakpad")
endif (STANDALONE)

View File

@ -12,6 +12,7 @@ include(LLVFS)
include(LLXML)
include(Linking)
include(UI)
include(FreeType)
include_directories(
${LLCOMMON_INCLUDE_DIRS}
@ -19,6 +20,7 @@ include_directories(
${LLMATH_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${LLXML_INCLUDE_DIRS}
${FREETYPE_INCLUDE_DIRS}
)
set(linux_crash_logger_SOURCE_FILES
@ -53,6 +55,7 @@ target_link_libraries(linux-crash-logger
${LLCOMMON_LIBRARIES}
${UI_LIBRARIES}
${DB_LIBRARIES}
${FREETYPE_LIBRARIES}
)
add_custom_target(linux-crash-logger-target ALL

View File

@ -69,10 +69,16 @@ bool windows_post_minidump_callback(const wchar_t* dump_path,
void setup_signals();
void default_unix_signal_handler(int signum, siginfo_t *info, void *);
#if LL_LINUX
#include "google_breakpad/minidump_descriptor.h"
bool unix_minidump_callback(const google_breakpad::MinidumpDescriptor& minidump_desc, void* context, bool succeeded);
#else
// Called by breakpad exception handler after the minidump has been generated.
bool unix_post_minidump_callback(const char *dump_dir,
const char *minidump_id,
void *context, bool succeeded);
#endif
# if LL_DARWIN
/* OSX doesn't support SIGRT* */
S32 LL_SMACKDOWN_SIGNAL = SIGUSR1;
@ -313,7 +319,7 @@ void LLApp::setupErrorHandling()
// Add google breakpad exception handler configured for Darwin/Linux.
bool installHandler = true;
#ifdef LL_DARWIN
#if LL_DARWIN
// For the special case of Darwin, we do not want to install the handler if
// the process is being debugged as the app will exit with value ABRT (6) if
// we do. Unfortunately, the code below which performs that test relies on
@ -346,14 +352,21 @@ void LLApp::setupErrorHandling()
installHandler = true;
}
#endif
#endif
if(installHandler && (mExceptionHandler == 0))
{
std::string dumpPath = "/tmp/";
mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true);
mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true, 0);
}
#elif LL_LINUX
if(installHandler && (mExceptionHandler == 0))
{
google_breakpad::MinidumpDescriptor desc("/tmp");
new google_breakpad::ExceptionHandler(desc, 0, &unix_minidump_callback, 0, true, 0);
}
#endif
#endif
startErrorThread();
}
@ -410,6 +423,9 @@ void LLApp::setMiniDumpDir(const std::string &path)
wchar_t buffer[MAX_MINDUMP_PATH_LENGTH];
mbstowcs(buffer, path.c_str(), MAX_MINDUMP_PATH_LENGTH);
mExceptionHandler->set_dump_path(std::wstring(buffer));
#elif LL_LINUX
google_breakpad::MinidumpDescriptor desc(path);
mExceptionHandler->set_minidump_descriptor(desc);
#else
mExceptionHandler->set_dump_path(path);
#endif
@ -857,6 +873,43 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *)
}
}
#if LL_LINUX
bool unix_minidump_callback(const google_breakpad::MinidumpDescriptor& minidump_desc, void* context, bool succeeded)
{
// Copy minidump file path into fixed buffer in the app instance to avoid
// heap allocations in a crash handler.
// path format: <dump_dir>/<minidump_id>.dmp
int dirPathLength = strlen(minidump_desc.path());
// The path must not be truncated.
llassert((dirPathLength + 5) <= LLApp::MAX_MINDUMP_PATH_LENGTH);
char * path = LLApp::instance()->getMiniDumpFilename();
S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH;
strncpy(path, minidump_desc.path(), remaining);
remaining -= dirPathLength;
path += dirPathLength;
if (remaining > 0 && dirPathLength > 0 && path[-1] != '/')
{
*path++ = '/';
--remaining;
}
llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl;
LLApp::runErrorHandler();
#ifndef LL_RELEASE_FOR_DOWNLOAD
clear_signals();
return false;
#else
return true;
#endif
}
#endif
bool unix_post_minidump_callback(const char *dump_dir,
const char *minidump_id,
void *context, bool succeeded)

View File

@ -38,7 +38,7 @@ typedef LLAtomic32<U32> LLAtomicU32;
class LLErrorThread;
class LLLiveFile;
#if LL_LINUX
typedef struct siginfo siginfo_t;
#include <signal.h>
#endif
typedef void (*LLAppErrorHandler)();

View File

@ -78,6 +78,7 @@ target_link_libraries(windows-crash-logger
gdi32
ole32
oleaut32
wininet
Wldap32
)