Esempio n. 1
0
size_t GetFileLineFromStack(size_t skip, char* fileName, size_t size, size_t* lineNumber, size_t* offsetBytes)
{
	void* address = NULL;
	GetStackFrames(skip + 1, &address, 1);
	if (address) {
		return GetFileLineFromAddress(address, fileName, size, lineNumber, offsetBytes);
	}
	return 0;
}
Esempio n. 2
0
size_t GetDescriptionFromAddress(void* address, const char* format,
                                 char* buffer, size_t size)
{
    char*const begin = buffer;
    char*const end = buffer + size;
    size_t line_number = 0;

    if (size) {
        *buffer = 0;
    }
    buffer += GetFileLineFromAddress(address, buffer, size, &line_number, NULL);
    size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;

    if (line_number) {
        char str[128];

        wsprintf(str, "(%d) : ", (int)line_number);
        if (size) {
            strncpy(buffer, str, size)[size - 1] = 0;
        }
        buffer += strlen(str);
        size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;
    }

    if (size) {
        strncpy(buffer, "at ", size)[size - 1] = 0;
    }
    buffer += strlen("at ");
    size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;

    buffer += GetSymbolNameFromAddress(address, buffer, size, NULL);
    size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;

    if (size) {
        strncpy(buffer, " in ", size)[size - 1] = 0;
    }
    buffer += strlen(" in ");
    size = (GC_ULONG_PTR)end < (GC_ULONG_PTR)buffer ? 0 : end - buffer;

    buffer += GetModuleNameFromAddress(address, buffer, size);
    return buffer - begin;
}