SlideShare a Scribd company logo
1 of 42
Кроссплатформенный краш-репорт.
Обзор возможностей google breakpad.
Докладчик: Демчук Дмитрий
Руководитель С++ отдела
Google Breakpad. Задача
Проблема
 Программы содержат дефекты;
 Дефекты проявляются на окружении
пользователя/тестировщика;
 Сборки с дефектами уходят в релиз;
Цель:
 Возможность исправлять дефекты по отчетам от
пользователей
Google Breakpad. Задача
Google Breakpad
Platforms:
 Windows
 Linux
 Mac OS X
 Solaris
 iOS
 Android
API индивидуальное под каждую платформу.
Report format:
 Minidump files (Microsoft)
Breakpad. Сборка
Windows:
1. GYP & Python
2. MSVC
Linux:
1. autotools
2. g++
Mac OS
1. xCode, autotools
2. clang, g++
Exception handling
App.exe
1. In - process
App.exe
2. out-of-process
crash.dmp crash.dmp
generates
CrashDumper.exe
IPC
generates
+ простая интеграция
- низкая надежность
- сложная интеграция
+ высокая надежность
Breakpad. Windows библиотеки
common.lib
exception_handler.lib
crash_generation_client.lib
crash_generation_server.lib
App.exe
common.lib
CrashDumper.exe
IPC
Windows. In-process-example
…
#include "exception_handler.h“
…
int main(int argc, char * argv[])
{
using namespace google_breakpad;
const std::wstring dumpPath(L"./");
ExceptionHandler handler(dumpPath,
&filterCallback, &minidumpCallback,
NULL, ExceptionHandler::HANDLER_ALL);
/// Application code
…
return 0;
}
Windows. In-process-example
…
#include "exception_handler.h“
bool filterCallback(void * context,
EXCEPTION_POINTERS * exinfo,
MDRawAssertionInfo * assertion)
{
return true;
}
bool minidumpCallback(const wchar_t * dump_path,
const wchar_t * minidump_id,
void * context,
EXCEPTION_POINTERS* exinfo,
MDRawAssertionInfo* assertion,
bool succeeded)
{
return true;
}
Windows. In-process-example
Application breakpad
new ExceptionHandler
set handlers
Worker thread
waitFor…
...
kernel32.dll
callback is invoked
start thread
wake upbool filterCallback(…)
WriteDump…
bool minidumpCallback(…)
Windows. Out-of-process Client
#include "exception_handler.h“
…
int main(int argc, char * argv[])
{
const std::wstring pipeName(L".pipeBreakpadCrashService");
const std::wstring dumpPath(L"./");
ExceptionHandler handler(dumpPath, &filterCallback,
&minidumpCallback, NULL,
ExceptionHandler::HANDLER_ALL,
MiniDumpNormal, pipeName.c_str(), NULL);
/// Application code
…
return 0;
}
Windows. Out-of-process Server
#include "client/windows/crash_generation/crash_generation_server.h"
#include "client/windows/crash_generation/client_info.h"
void onClientConnectedCallback(void * context,
const ClientInfo * client_info)
{
std::cout << "Client is connected pid= " << client_info->pid()
<< std::endl;
}
void onClientDumpRequestCallback(void * context,
const ClientInfo * client_info,
const std::wstring * file_path)
{
std::cout << "pid = " << client_info->pid() << std::endl;
}
…
Windows. Out-of-process Server
#include "client/windows/crash_generation/crash_generation_server.h"
#include "client/windows/crash_generation/client_info.h"
…
void onClientExitedCallback(void * context,
const google_breakpad::ClientInfo * client_info)
{
std::cout << "Client is exited pid = " << client_info->pid()
<< std::endl;
}
void onClientUploadRequestCallback(void* context, const DWORD crash_id)
{
std::cout << "Client upload request callback crashID = " << crash_id
<< std::endl;
}
…
Windows. Out-of-process Server
…
int main(int argc, char * argv[])
{
using namespace google_breakpad;
const std::wstring pipeName(L".pipeBreakpadCrashService");
const std::wstring dumpPath(L"./");
CrashGenerationServer server(pipeName, NULL,
onClientConnectedCallback, NULL,
onClientDumpRequestCallback, NULL,
onClientExitedCallback, NULL,
onClientUploadRequestCallback, NULL,
true, &dumpPath);
if (!server.Start())
return -1;
Sleep(INFINITE);
return 0;
}
Breakpad. Out-of-process-example
app.exe breakpad
Worker thread
waitFor…
...
filterCallback
WriteDump…
waitFor…minidumpCallback
breakpad CrashService.exe
onClientConnectedCallback
onClientDumpRequestCallback
onClientExitedCallback
Breakpad. Capture dump
…
int main(int argc, char * argv[])
{
using namespace google_breakpad;
const std::wstring dumpPath(L"./");
ExceptionHandler handler(dumpPath, &filterCallback,
&minidumpCallback, NULL,
ExceptionHandler::HANDLER_ALL);
/// Application code
…
handler.WriteMinidump();
…
return 0;
}
Windows. Реализация
Обработчики
SetUnhandledExceptionFilter(…);
__set_invalid_parameter_handler(…);
__set_purecall_handler(…);
Снятие дампа
DbgHelp.dll
BOOL MiniDumpWriteDump(HANDLE hProcess,
DWORD ProcessId, HANDLE hFile … );
Открытие *dmp для Windows
application.exe
lib1.dll
...
libN.dll
application.pdb
lib1. pdb
...
libN. pdb
source code
crash.dmp
Breakpad. Linux библиотеки
breakpad_client
breakpad_client
App
CrashDumper
IPC
Linux. In-process example
#include "exception_handler.h“
bool filterCallback(void * context)
{
return true;
}
bool minidumpCallback(const MinidumpDescriptor & descriptor,
void * context, bool succeeded)
{
return true;
}
…
Linux. In-process example
…
int main(int argc, char * argv[])
{
using namespace google_breakpad;
MinidumpDescriptor descriptor("./");
ExceptionHandler handler(descriptor, &filterCallback,
&minidumpCallback, NULL,
true, -1);
/// Application code
…
return 0;
}
Linux. In-process example
app.exe breakpad
...
filterCallback
minidumpCallback
sigaction
app.exebreakpad
sys_clone
Create *dmp
new ExceptionHandler
Linux. Out-of-process Client
#include "exception_handler.h"
#include "examplesCommon/common.h"
using namespace google_breakpad;
bool filterCallback(void * context)…
bool minidumpCallback(const MinidumpDescriptor & descriptor,
void * context, bool succeeded)…
int main(int argc, char * argv[]) {
int serverFD(0);
MinidumpDescriptor descriptor("./");
ExceptionHandler handler(descriptor, &filterCallback,
&minidumpCallback, NULL, true, serverFD);
/// Application code
…
return 0;
}
Linux. Out-of-process Server
#include "client/linux/crash_generation/crash_generation_server.h“
#include "client/linux/crash_generation/client_info.h"
using namespace google_breakpad;
void onClientDumpRequestCallback(void * context,
const ClientInfo * client_info,
const std::string * file_path)
{
}
void OnClientExitingCallback(void * context,
const ClientInfo * client_info)
{
}
Linux. Out-of-process Server
#include "client/linux/crash_generation/crash_generation_server.h“
#include "client/linux/crash_generation/client_info.h"
using namespace google_breakpad;
…
int main(int argc, char * argv[])
{
const std::string dumpPath("./");
int serverFD(0), clientFD(0);
if (!CrashGenerationServer::CreateReportChannel(&serverFD, &clientFD))
return -1;
CrashGenerationServer server(serverFD,
&onClientDumpRequestCallback, NULL,
&OnClientExitingCallback, NULL, true, &dumpPath);
server.Start();
sleep(100000000);
…
}
Linux. Реализация
 Обработчики
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS
 Снятие дампа
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void
*data);
Linux. Инструменты работы с dmp
5d8cb….2a102.dmp
dump_symsapplication
my_lib.so
application.sym
my_lib.sym
symbols
… …
minidump_stackwalk stack trace
Thread 0 (crashed)
0 inProcessExample!handleArgs(int, char**, google_breakpad::ExceptionHandler*)
[common.cpp : 86 + 0x3]
eip = 0x0804e015 esp = 0xbf916db0 ebp = 0xbf916dd8 ebx = 0x002ebff4
esi = 0x00000000 edi = 0x00000000 eax = 0x00000000 ecx = 0x002ed8b8
edx = 0x00000000 efl = 0x00210286
Found by: given as instruction pointer in context
1 inProcessExample!main [main.cpp : 29 + 0x1a]
eip = 0x0804db77 esp = 0xbf916de0 ebp = 0xbf916e88 ebx = 0x002ebff4
esi = 0x00000000 edi = 0x00000000
Found by: call frame info
2 libc-2.15.so + 0x194d3
eip = 0x0015f4d3 esp = 0xbf916e90 ebp = 0x00000000 ebx = 0x002ebff4
esi = 0x00000000 edi = 0x00000000
Found by: call frame info
3 libc-2.15.so + 0x1a5ff4
eip = 0x002ebff4 esp = 0xbf916eb8 ebp = 0x00000000
Found by: stack scanning
4 inProcessExample + 0x5928
eip = 0x0804d928 esp = 0xbf916ee0 ebp = 0x00000000
minidump-2-core *.core
Linux core file
Linux. Утилита dump_syms
dump_syms
inProcessExample
…
MODULE Linux x86 62F39E85D30A5F150EBD5B34E085C7AC0 inProcessExample
FILE 0 /home/user/GoogleBreakPad/breakpad/./src/client/linux/crash_generation/crash_generation_client.h
FILE 1 /home/user/GoogleBreakPad/breakpad/./src/client/linux/handler/microdump_extra_info.h
FILE 2 /home/use
...
FUNC 5660 39 0 MinidumpWriter::MinidumpWriter
5660 f 124 27
566f 2a 142 27
FUNC 569a 1d9 0 MinidumpWriter::WriteFile
569a 1 1118 27
...
symbols
└── inProcessExample
└── 62F39E85D30A5F150EBD5B34E085C7AC0
└── inProcessExample.sym
Linux. Stack trace
Operating system: Linux
0.0.0 Linux 3.2.0-70-generic #105-
Ubuntu SMP Wed Sep 24 19:49:46 UTC 2014 i686
CPU: x86
GenuineIntel family 6 model 42 stepping 7
1 CPU
Crash reason: SIGSEGV
Crash address: 0x0
Process uptime: not available
Thread 0 (crashed)
0 inProcessExample!handleArgs(int, char**,
google_breakpad::ExceptionHandler*) [common.cpp : 86 +
0x3]
eip = 0x0804e015 esp = 0xbf916db0 ebp =
0xbf916dd8 ebx = 0x002ebff4
esi = 0x00000000 edi = 0x00000000 eax =
0x00000000 ecx = 0x002ed8b8
edx = 0x00000000 efl = 0x00210286
Found by: given as instruction pointer in context
Linux. Stack trace
…
0x00000000 ecx = 0x002ed8b8
edx = 0x00000000 efl = 0x00210286
Found by: given as instruction pointer in context
1 inProcessExample!main [main.cpp : 29 + 0x1a]
eip = 0x0804db77 esp = 0xbf916de0 ebp =
0xbf916e88 ebx = 0x002ebff4
esi = 0x00000000 edi = 0x00000000
Found by: call frame info
2 libc-2.15.so + 0x194d3
eip = 0x0015f4d3 esp = 0xbf916e90 ebp =
0x00000000 ebx = 0x002ebff4
esi = 0x00000000 edi = 0x00000000
Found by: call frame info
…
Linux. Core - file
> ./minidump-2-core 5d8cbd57-7164-867f-416fe783-2a02a102.dmp >
5d8cbd57-7164-867f-416fe783-2a02a102.core
> gdb 5d8cbd57-7164-867f-416fe783-2a02a102.core
inProcessExample
Program terminated with signal 11, Segmentation fault.
#0 0x0804e015 in handleArgs (argc=2, argv=0xbf916f24,
handler=0xbf916e04)
at
/home/user/GoogleBreakPad/samples/source/examplesCommon/common
.cpp:86
86 *i = 12;
(gdb) bt
…
Linux. Core - file
(gdb) bt
#0 0x0804e015 in handleArgs (argc=2, argv=0xbf916f24,
handler=0xbf916e04)
at
/home/user/GoogleBreakPad/samples/source/examplesCommon
/common.cpp:86
#1 0x0804db77 in main (argc=2, argv=0xbf916f24)
at
/home/user/GoogleBreakPad/samples/source/linux/inProces
sExample/main.cpp:29
(gdb)
Breakpad. Mac OS. Библиотеки
Breakpad.Framework
Breakpad.Framework
App
CrashDumper
IPC
Mac OS. In-process example
#include "exception_handler.h“
bool filterCallback(void *context)
{
return true;
}
bool minidumpCallback(const char * dump_dir,
const char * minidump_id,
void * context, bool succeeded)
{
return true;
}
…
Mac OS. In-process example
int main(int argc, char * argv[])
{
using namespace google_breakpad;
ExceptionHandler handler("./", &filterCallback,
&minidumpCallback, NULL,
true, NULL);
/// Application code
…
return 0;
}
Mac OS. Out-of-process Client
#include "exception_handler.h“
…
int main(int argc, char * argv[])
{
using namespace google_breakpad;
const char * serverPort = "crash_generation_server";
ExceptionHandler handler("./", &filterCallback,
&minidumpCallback, NULL,
true, serverPort);
/// Application code
…
return 0;
}
Mac OS. Out-of-process Server
#include "client/mac/crash_generation/crash_generation_server.h“
#include "client/mac/crash_generation/client_info.h"
using namespace google_breakpad;
bool filterCallback(void *context)
{
std::cout << "filterCallback is invoked" << std::endl;
return true;
}
void onClientDumpRequestCallback(void * context, const ClientInfo & client_info,
const std::string & file_path)
{
std::cout << "Client dump request callback threadId = " << client_info.pid() << std::endl;
}
void OnClientExitingCallback(void * context, const ClientInfo & client_info)
{
std::cout << "Client is exited threadId = " << client_info.pid() << std::endl;
}
Mac OS. Out-of-process Server
int main(int argc, char * argv[])
{
const std::string dumpPath("./crashes/");
const char * serverPort = "crash_generation_server";
CrashGenerationServer server(serverPort,
&filterCallback, NULL,
&onClientDumpRequestCallback, NULL,
&OnClientExitingCallback, NULL, true,
dumpPath);
if (!server.Start())
return -1;
sleep(10000000);
return 0;
}
Report server?
breakpad
App.exe
CrashDumper.exe
breakpad
IPC
21a7ccc…. 7067.dmp
generates
Internet
Unix Server
minidump_s
tackwalk
*.dmp *.sym
stack trace
Report server
 Soccoro (Mozilla)
 mini-breakpad-server
Общие рекомендации
1. Сборка
 Релизные сборки с отладочной информацией
RelWithDebInfo (/Zi)
 Система версионирования сборок/бинарников
 Зашивать номер версии в ресурсы бинарников
 Хранить все артефакты от публичных релизов (source +
binary + pdb)
2. Реализация out-of-processs способа
 Когда и как стартует/останавливается вспомогательный
процесс
 Реализация посылки краш-репорта на сервер
Спасибо за внимание!
Докладчик: Демчук Дмитрий

More Related Content

What's hot

Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations
DVClub
 
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerabilityCsw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
CanSecWest
 

What's hot (20)

Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
How to make a large C++-code base manageable
How to make a large C++-code base manageableHow to make a large C++-code base manageable
How to make a large C++-code base manageable
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
C++17 now
C++17 nowC++17 now
C++17 now
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
TensorFlow XLA RPC
TensorFlow XLA RPCTensorFlow XLA RPC
TensorFlow XLA RPC
 
Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations Architecture for Massively Parallel HDL Simulations
Architecture for Massively Parallel HDL Simulations
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуля
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
 
Tiramisu概要
Tiramisu概要Tiramisu概要
Tiramisu概要
 
200 Open Source Projects Later: Source Code Static Analysis Experience
200 Open Source Projects Later: Source Code Static Analysis Experience200 Open Source Projects Later: Source Code Static Analysis Experience
200 Open Source Projects Later: Source Code Static Analysis Experience
 
Tensor comprehensions
Tensor comprehensionsTensor comprehensions
Tensor comprehensions
 
2018 cosup-delete unused python code safely - english
2018 cosup-delete unused python code safely - english2018 cosup-delete unused python code safely - english
2018 cosup-delete unused python code safely - english
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' Mistakes
 
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerabilityCsw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
Csw2016 gong pwn_a_nexus_device_with_a_single_vulnerability
 

Viewers also liked

Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Platonov Sergey
 

Viewers also liked (17)

Institute for Sustainable Technology
Institute for Sustainable TechnologyInstitute for Sustainable Technology
Institute for Sustainable Technology
 
Wiki-подход к организации студенческих исследований
Wiki-подход к организации студенческих исследованийWiki-подход к организации студенческих исследований
Wiki-подход к организации студенческих исследований
 
Gor Nishanov, C++ Coroutines – a negative overhead abstraction
Gor Nishanov,  C++ Coroutines – a negative overhead abstractionGor Nishanov,  C++ Coroutines – a negative overhead abstraction
Gor Nishanov, C++ Coroutines – a negative overhead abstraction
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 

Similar to Дмитрий Демчук. Кроссплатформенный краш-репорт

Crash dump analysis - experience sharing
Crash dump analysis - experience sharingCrash dump analysis - experience sharing
Crash dump analysis - experience sharing
James Hsieh
 
Crash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_TizenCrash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_Tizen
Lex Yu
 
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
Phuoc Nguyen
 
Introductiontoasp netwindbgdebugging-100506045407-phpapp01
Introductiontoasp netwindbgdebugging-100506045407-phpapp01Introductiontoasp netwindbgdebugging-100506045407-phpapp01
Introductiontoasp netwindbgdebugging-100506045407-phpapp01
Camilo Alvarez Rivera
 
Application of Radare2 Illustrated by Shylock and Snakso.A Analysis
Application of Radare2 Illustrated by Shylock and Snakso.A AnalysisApplication of Radare2 Illustrated by Shylock and Snakso.A Analysis
Application of Radare2 Illustrated by Shylock and Snakso.A Analysis
Positive Hack Days
 
sponsorAVAST-VB2014
sponsorAVAST-VB2014sponsorAVAST-VB2014
sponsorAVAST-VB2014
Martin Hron
 

Similar to Дмитрий Демчук. Кроссплатформенный краш-репорт (20)

Crash dump analysis - experience sharing
Crash dump analysis - experience sharingCrash dump analysis - experience sharing
Crash dump analysis - experience sharing
 
Linux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudLinux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloud
 
Crash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_TizenCrash_Report_Mechanism_In_Tizen
Crash_Report_Mechanism_In_Tizen
 
Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development Android Nâng cao-Bài 9-Debug in Android Application Development
Android Nâng cao-Bài 9-Debug in Android Application Development
 
Stability issues of user space
Stability issues of user spaceStability issues of user space
Stability issues of user space
 
Lecture 6 Kernel Debugging + Ports Development
Lecture 6 Kernel Debugging + Ports DevelopmentLecture 6 Kernel Debugging + Ports Development
Lecture 6 Kernel Debugging + Ports Development
 
MyShell - English
MyShell - EnglishMyShell - English
MyShell - English
 
PVS-Studio, a solution for resource intensive applications development
PVS-Studio, a solution for resource intensive applications developmentPVS-Studio, a solution for resource intensive applications development
PVS-Studio, a solution for resource intensive applications development
 
Valgrind
ValgrindValgrind
Valgrind
 
Introductiontoasp netwindbgdebugging-100506045407-phpapp01
Introductiontoasp netwindbgdebugging-100506045407-phpapp01Introductiontoasp netwindbgdebugging-100506045407-phpapp01
Introductiontoasp netwindbgdebugging-100506045407-phpapp01
 
Implementações paralelas
Implementações paralelasImplementações paralelas
Implementações paralelas
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
 
Debugging Python with gdb
Debugging Python with gdbDebugging Python with gdb
Debugging Python with gdb
 
[2009 CodeEngn Conference 03] koheung - 윈도우 커널 악성코드에 대한 분석 및 방법
[2009 CodeEngn Conference 03] koheung - 윈도우 커널 악성코드에 대한 분석 및 방법[2009 CodeEngn Conference 03] koheung - 윈도우 커널 악성코드에 대한 분석 및 방법
[2009 CodeEngn Conference 03] koheung - 윈도우 커널 악성코드에 대한 분석 및 방법
 
Application of Radare2 Illustrated by Shylock and Snakso.A Analysis
Application of Radare2 Illustrated by Shylock and Snakso.A AnalysisApplication of Radare2 Illustrated by Shylock and Snakso.A Analysis
Application of Radare2 Illustrated by Shylock and Snakso.A Analysis
 
Formbook - In-depth malware analysis (Botconf 2018)
Formbook - In-depth malware analysis (Botconf 2018)Formbook - In-depth malware analysis (Botconf 2018)
Formbook - In-depth malware analysis (Botconf 2018)
 
Android Logging System
Android Logging SystemAndroid Logging System
Android Logging System
 
sponsorAVAST-VB2014
sponsorAVAST-VB2014sponsorAVAST-VB2014
sponsorAVAST-VB2014
 
tools.ppt
tools.ppttools.ppt
tools.ppt
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?
 

More from Sergey Platonov

More from Sergey Platonov (17)

Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного багаЛев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.io
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Илья Шишков, Принципы создания тестируемого кода
Илья Шишков, Принципы создания тестируемого кодаИлья Шишков, Принципы создания тестируемого кода
Илья Шишков, Принципы создания тестируемого кода
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 

Recently uploaded

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
anilsa9823
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
anilsa9823
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Recently uploaded (20)

The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 

Дмитрий Демчук. Кроссплатформенный краш-репорт

  • 1. Кроссплатформенный краш-репорт. Обзор возможностей google breakpad. Докладчик: Демчук Дмитрий Руководитель С++ отдела
  • 2. Google Breakpad. Задача Проблема  Программы содержат дефекты;  Дефекты проявляются на окружении пользователя/тестировщика;  Сборки с дефектами уходят в релиз; Цель:  Возможность исправлять дефекты по отчетам от пользователей
  • 4. Google Breakpad Platforms:  Windows  Linux  Mac OS X  Solaris  iOS  Android API индивидуальное под каждую платформу. Report format:  Minidump files (Microsoft)
  • 5. Breakpad. Сборка Windows: 1. GYP & Python 2. MSVC Linux: 1. autotools 2. g++ Mac OS 1. xCode, autotools 2. clang, g++
  • 6. Exception handling App.exe 1. In - process App.exe 2. out-of-process crash.dmp crash.dmp generates CrashDumper.exe IPC generates + простая интеграция - низкая надежность - сложная интеграция + высокая надежность
  • 8. Windows. In-process-example … #include "exception_handler.h“ … int main(int argc, char * argv[]) { using namespace google_breakpad; const std::wstring dumpPath(L"./"); ExceptionHandler handler(dumpPath, &filterCallback, &minidumpCallback, NULL, ExceptionHandler::HANDLER_ALL); /// Application code … return 0; }
  • 9. Windows. In-process-example … #include "exception_handler.h“ bool filterCallback(void * context, EXCEPTION_POINTERS * exinfo, MDRawAssertionInfo * assertion) { return true; } bool minidumpCallback(const wchar_t * dump_path, const wchar_t * minidump_id, void * context, EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion, bool succeeded) { return true; }
  • 10. Windows. In-process-example Application breakpad new ExceptionHandler set handlers Worker thread waitFor… ... kernel32.dll callback is invoked start thread wake upbool filterCallback(…) WriteDump… bool minidumpCallback(…)
  • 11. Windows. Out-of-process Client #include "exception_handler.h“ … int main(int argc, char * argv[]) { const std::wstring pipeName(L".pipeBreakpadCrashService"); const std::wstring dumpPath(L"./"); ExceptionHandler handler(dumpPath, &filterCallback, &minidumpCallback, NULL, ExceptionHandler::HANDLER_ALL, MiniDumpNormal, pipeName.c_str(), NULL); /// Application code … return 0; }
  • 12. Windows. Out-of-process Server #include "client/windows/crash_generation/crash_generation_server.h" #include "client/windows/crash_generation/client_info.h" void onClientConnectedCallback(void * context, const ClientInfo * client_info) { std::cout << "Client is connected pid= " << client_info->pid() << std::endl; } void onClientDumpRequestCallback(void * context, const ClientInfo * client_info, const std::wstring * file_path) { std::cout << "pid = " << client_info->pid() << std::endl; } …
  • 13. Windows. Out-of-process Server #include "client/windows/crash_generation/crash_generation_server.h" #include "client/windows/crash_generation/client_info.h" … void onClientExitedCallback(void * context, const google_breakpad::ClientInfo * client_info) { std::cout << "Client is exited pid = " << client_info->pid() << std::endl; } void onClientUploadRequestCallback(void* context, const DWORD crash_id) { std::cout << "Client upload request callback crashID = " << crash_id << std::endl; } …
  • 14. Windows. Out-of-process Server … int main(int argc, char * argv[]) { using namespace google_breakpad; const std::wstring pipeName(L".pipeBreakpadCrashService"); const std::wstring dumpPath(L"./"); CrashGenerationServer server(pipeName, NULL, onClientConnectedCallback, NULL, onClientDumpRequestCallback, NULL, onClientExitedCallback, NULL, onClientUploadRequestCallback, NULL, true, &dumpPath); if (!server.Start()) return -1; Sleep(INFINITE); return 0; }
  • 15. Breakpad. Out-of-process-example app.exe breakpad Worker thread waitFor… ... filterCallback WriteDump… waitFor…minidumpCallback breakpad CrashService.exe onClientConnectedCallback onClientDumpRequestCallback onClientExitedCallback
  • 16. Breakpad. Capture dump … int main(int argc, char * argv[]) { using namespace google_breakpad; const std::wstring dumpPath(L"./"); ExceptionHandler handler(dumpPath, &filterCallback, &minidumpCallback, NULL, ExceptionHandler::HANDLER_ALL); /// Application code … handler.WriteMinidump(); … return 0; }
  • 18. Открытие *dmp для Windows application.exe lib1.dll ... libN.dll application.pdb lib1. pdb ... libN. pdb source code crash.dmp
  • 20. Linux. In-process example #include "exception_handler.h“ bool filterCallback(void * context) { return true; } bool minidumpCallback(const MinidumpDescriptor & descriptor, void * context, bool succeeded) { return true; } …
  • 21. Linux. In-process example … int main(int argc, char * argv[]) { using namespace google_breakpad; MinidumpDescriptor descriptor("./"); ExceptionHandler handler(descriptor, &filterCallback, &minidumpCallback, NULL, true, -1); /// Application code … return 0; }
  • 22. Linux. In-process example app.exe breakpad ... filterCallback minidumpCallback sigaction app.exebreakpad sys_clone Create *dmp new ExceptionHandler
  • 23. Linux. Out-of-process Client #include "exception_handler.h" #include "examplesCommon/common.h" using namespace google_breakpad; bool filterCallback(void * context)… bool minidumpCallback(const MinidumpDescriptor & descriptor, void * context, bool succeeded)… int main(int argc, char * argv[]) { int serverFD(0); MinidumpDescriptor descriptor("./"); ExceptionHandler handler(descriptor, &filterCallback, &minidumpCallback, NULL, true, serverFD); /// Application code … return 0; }
  • 24. Linux. Out-of-process Server #include "client/linux/crash_generation/crash_generation_server.h“ #include "client/linux/crash_generation/client_info.h" using namespace google_breakpad; void onClientDumpRequestCallback(void * context, const ClientInfo * client_info, const std::string * file_path) { } void OnClientExitingCallback(void * context, const ClientInfo * client_info) { }
  • 25. Linux. Out-of-process Server #include "client/linux/crash_generation/crash_generation_server.h“ #include "client/linux/crash_generation/client_info.h" using namespace google_breakpad; … int main(int argc, char * argv[]) { const std::string dumpPath("./"); int serverFD(0), clientFD(0); if (!CrashGenerationServer::CreateReportChannel(&serverFD, &clientFD)) return -1; CrashGenerationServer server(serverFD, &onClientDumpRequestCallback, NULL, &OnClientExitingCallback, NULL, true, &dumpPath); server.Start(); sleep(100000000); … }
  • 26. Linux. Реализация  Обработчики int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS  Снятие дампа long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
  • 27. Linux. Инструменты работы с dmp 5d8cb….2a102.dmp dump_symsapplication my_lib.so application.sym my_lib.sym symbols … … minidump_stackwalk stack trace Thread 0 (crashed) 0 inProcessExample!handleArgs(int, char**, google_breakpad::ExceptionHandler*) [common.cpp : 86 + 0x3] eip = 0x0804e015 esp = 0xbf916db0 ebp = 0xbf916dd8 ebx = 0x002ebff4 esi = 0x00000000 edi = 0x00000000 eax = 0x00000000 ecx = 0x002ed8b8 edx = 0x00000000 efl = 0x00210286 Found by: given as instruction pointer in context 1 inProcessExample!main [main.cpp : 29 + 0x1a] eip = 0x0804db77 esp = 0xbf916de0 ebp = 0xbf916e88 ebx = 0x002ebff4 esi = 0x00000000 edi = 0x00000000 Found by: call frame info 2 libc-2.15.so + 0x194d3 eip = 0x0015f4d3 esp = 0xbf916e90 ebp = 0x00000000 ebx = 0x002ebff4 esi = 0x00000000 edi = 0x00000000 Found by: call frame info 3 libc-2.15.so + 0x1a5ff4 eip = 0x002ebff4 esp = 0xbf916eb8 ebp = 0x00000000 Found by: stack scanning 4 inProcessExample + 0x5928 eip = 0x0804d928 esp = 0xbf916ee0 ebp = 0x00000000 minidump-2-core *.core Linux core file
  • 28. Linux. Утилита dump_syms dump_syms inProcessExample … MODULE Linux x86 62F39E85D30A5F150EBD5B34E085C7AC0 inProcessExample FILE 0 /home/user/GoogleBreakPad/breakpad/./src/client/linux/crash_generation/crash_generation_client.h FILE 1 /home/user/GoogleBreakPad/breakpad/./src/client/linux/handler/microdump_extra_info.h FILE 2 /home/use ... FUNC 5660 39 0 MinidumpWriter::MinidumpWriter 5660 f 124 27 566f 2a 142 27 FUNC 569a 1d9 0 MinidumpWriter::WriteFile 569a 1 1118 27 ... symbols └── inProcessExample └── 62F39E85D30A5F150EBD5B34E085C7AC0 └── inProcessExample.sym
  • 29. Linux. Stack trace Operating system: Linux 0.0.0 Linux 3.2.0-70-generic #105- Ubuntu SMP Wed Sep 24 19:49:46 UTC 2014 i686 CPU: x86 GenuineIntel family 6 model 42 stepping 7 1 CPU Crash reason: SIGSEGV Crash address: 0x0 Process uptime: not available Thread 0 (crashed) 0 inProcessExample!handleArgs(int, char**, google_breakpad::ExceptionHandler*) [common.cpp : 86 + 0x3] eip = 0x0804e015 esp = 0xbf916db0 ebp = 0xbf916dd8 ebx = 0x002ebff4 esi = 0x00000000 edi = 0x00000000 eax = 0x00000000 ecx = 0x002ed8b8 edx = 0x00000000 efl = 0x00210286 Found by: given as instruction pointer in context
  • 30. Linux. Stack trace … 0x00000000 ecx = 0x002ed8b8 edx = 0x00000000 efl = 0x00210286 Found by: given as instruction pointer in context 1 inProcessExample!main [main.cpp : 29 + 0x1a] eip = 0x0804db77 esp = 0xbf916de0 ebp = 0xbf916e88 ebx = 0x002ebff4 esi = 0x00000000 edi = 0x00000000 Found by: call frame info 2 libc-2.15.so + 0x194d3 eip = 0x0015f4d3 esp = 0xbf916e90 ebp = 0x00000000 ebx = 0x002ebff4 esi = 0x00000000 edi = 0x00000000 Found by: call frame info …
  • 31. Linux. Core - file > ./minidump-2-core 5d8cbd57-7164-867f-416fe783-2a02a102.dmp > 5d8cbd57-7164-867f-416fe783-2a02a102.core > gdb 5d8cbd57-7164-867f-416fe783-2a02a102.core inProcessExample Program terminated with signal 11, Segmentation fault. #0 0x0804e015 in handleArgs (argc=2, argv=0xbf916f24, handler=0xbf916e04) at /home/user/GoogleBreakPad/samples/source/examplesCommon/common .cpp:86 86 *i = 12; (gdb) bt …
  • 32. Linux. Core - file (gdb) bt #0 0x0804e015 in handleArgs (argc=2, argv=0xbf916f24, handler=0xbf916e04) at /home/user/GoogleBreakPad/samples/source/examplesCommon /common.cpp:86 #1 0x0804db77 in main (argc=2, argv=0xbf916f24) at /home/user/GoogleBreakPad/samples/source/linux/inProces sExample/main.cpp:29 (gdb)
  • 33. Breakpad. Mac OS. Библиотеки Breakpad.Framework Breakpad.Framework App CrashDumper IPC
  • 34. Mac OS. In-process example #include "exception_handler.h“ bool filterCallback(void *context) { return true; } bool minidumpCallback(const char * dump_dir, const char * minidump_id, void * context, bool succeeded) { return true; } …
  • 35. Mac OS. In-process example int main(int argc, char * argv[]) { using namespace google_breakpad; ExceptionHandler handler("./", &filterCallback, &minidumpCallback, NULL, true, NULL); /// Application code … return 0; }
  • 36. Mac OS. Out-of-process Client #include "exception_handler.h“ … int main(int argc, char * argv[]) { using namespace google_breakpad; const char * serverPort = "crash_generation_server"; ExceptionHandler handler("./", &filterCallback, &minidumpCallback, NULL, true, serverPort); /// Application code … return 0; }
  • 37. Mac OS. Out-of-process Server #include "client/mac/crash_generation/crash_generation_server.h“ #include "client/mac/crash_generation/client_info.h" using namespace google_breakpad; bool filterCallback(void *context) { std::cout << "filterCallback is invoked" << std::endl; return true; } void onClientDumpRequestCallback(void * context, const ClientInfo & client_info, const std::string & file_path) { std::cout << "Client dump request callback threadId = " << client_info.pid() << std::endl; } void OnClientExitingCallback(void * context, const ClientInfo & client_info) { std::cout << "Client is exited threadId = " << client_info.pid() << std::endl; }
  • 38. Mac OS. Out-of-process Server int main(int argc, char * argv[]) { const std::string dumpPath("./crashes/"); const char * serverPort = "crash_generation_server"; CrashGenerationServer server(serverPort, &filterCallback, NULL, &onClientDumpRequestCallback, NULL, &OnClientExitingCallback, NULL, true, dumpPath); if (!server.Start()) return -1; sleep(10000000); return 0; }
  • 40. Report server  Soccoro (Mozilla)  mini-breakpad-server
  • 41. Общие рекомендации 1. Сборка  Релизные сборки с отладочной информацией RelWithDebInfo (/Zi)  Система версионирования сборок/бинарников  Зашивать номер версии в ресурсы бинарников  Хранить все артефакты от публичных релизов (source + binary + pdb) 2. Реализация out-of-processs способа  Когда и как стартует/останавливается вспомогательный процесс  Реализация посылки краш-репорта на сервер