improved shutdown delay debugging

This commit is contained in:
Arvid Norberg 2012-04-01 00:42:31 +00:00
parent db65ec2fd3
commit b29b2314b2
4 changed files with 9 additions and 7 deletions

View File

@ -47,7 +47,7 @@ extern char const* libtorrent_assert_log;
#include <string> #include <string>
std::string demangle(char const* name); std::string demangle(char const* name);
void print_backtrace(char* out, int len); void print_backtrace(char* out, int len, int max_depth = 0);
#if (defined __linux__ || defined __MACH__) && defined __GNUC__ && !TORRENT_USE_SYSTEM_ASSERT #if (defined __linux__ || defined __MACH__) && defined __GNUC__ && !TORRENT_USE_SYSTEM_ASSERT

View File

@ -62,7 +62,7 @@ namespace libtorrent
if (a.stack.empty()) if (a.stack.empty())
{ {
char stack_text[10000]; char stack_text[10000];
print_backtrace(stack_text, sizeof(stack_text)); print_backtrace(stack_text, sizeof(stack_text), 9);
a.stack = stack_text; a.stack = stack_text;
} }
++a.refs; ++a.refs;

View File

@ -114,7 +114,7 @@ std::string demangle(char const* name) { return name; }
#if (defined __linux__ || (defined __APPLE__ && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050)) #if (defined __linux__ || (defined __APPLE__ && MAC_OS_X_VERSION_MIN_REQUIRED >= 1050))
#include <execinfo.h> #include <execinfo.h>
void print_backtrace(char* out, int len) void print_backtrace(char* out, int len, int max_depth)
{ {
void* stack[50]; void* stack[50];
int size = backtrace(stack, 50); int size = backtrace(stack, 50);
@ -125,6 +125,7 @@ void print_backtrace(char* out, int len)
int ret = snprintf(out, len, "%d: %s\n", i, demangle(symbols[i]).c_str()); int ret = snprintf(out, len, "%d: %s\n", i, demangle(symbols[i]).c_str());
out += ret; out += ret;
len -= ret; len -= ret;
if (i - 1 == max_depth && max_depth > 0) break;
} }
free(symbols); free(symbols);
@ -141,7 +142,7 @@ void print_backtrace(char* out, int len)
#include "winbase.h" #include "winbase.h"
#include "dbghelp.h" #include "dbghelp.h"
void print_backtrace(char* out, int len) void print_backtrace(char* out, int len, int max_depth)
{ {
typedef USHORT (*RtlCaptureStackBackTrace_t)( typedef USHORT (*RtlCaptureStackBackTrace_t)(
__in ULONG FramesToSkip, __in ULONG FramesToSkip,
@ -188,13 +189,14 @@ void print_backtrace(char* out, int len)
out += ret; out += ret;
len -= ret; len -= ret;
if (i == max_depth && max_depth > 0) break;
} }
free(symbol); free(symbol);
} }
#else #else
void print_backtrace(char* out, int len) {} void print_backtrace(char* out, int len, int max_depth) {}
#endif #endif
@ -213,7 +215,7 @@ TORRENT_EXPORT void assert_fail(char const* expr, int line, char const* file
#endif #endif
char stack[8192]; char stack[8192];
print_backtrace(stack, sizeof(stack)); print_backtrace(stack, sizeof(stack), 0);
fprintf(out, "assertion failed. Please file a bugreport at " fprintf(out, "assertion failed. Please file a bugreport at "
"http://code.rasterbar.com/libtorrent/newticket\n" "http://code.rasterbar.com/libtorrent/newticket\n"

View File

@ -5502,7 +5502,7 @@ namespace aux {
{ {
sleep(1000); sleep(1000);
++counter; ++counter;
printf("\n==== Waiting to shut down: %d ==== \n\n", counter); printf("\n==== Waiting to shut down: %d ==== conn-queue: %d\n\n", counter, m_half_open.size());
} }
async_dec_threads(); async_dec_threads();
#endif #endif