b959d46dbd
The get_stack_trace syscall generates a stack trace using the kernel debugging facilities and copies the resulting return address array to the preallocated buffer from userland. It is only possible to get a stack trace of the current thread. The lookup_symbol syscall can be used to look up the symbol and image name corresponding to an address. It can be used to resolve symbols from a stack trace generated by the get_stack_trace syscall. Only symbols of the current team can be looked up. Note that this uses the symbol lookup of the kernel debugger which does not support lookup of all symbols (static functions are missing for example). This is meant to be used in situations where more elaborate stack trace generation, like done in the userland debugging helpers, is not possible due to constraints.
67 lines
1.9 KiB
C
67 lines
1.9 KiB
C
/*
|
|
* Copyright 2005, Haiku Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT license.
|
|
*
|
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
|
* Distributed under the terms of the NewOS License.
|
|
*/
|
|
#ifndef _KERNEL_ELF_H
|
|
#define _KERNEL_ELF_H
|
|
|
|
|
|
#include <elf_common.h>
|
|
#include <thread.h>
|
|
#include <image.h>
|
|
|
|
|
|
struct kernel_args;
|
|
|
|
|
|
struct elf_symbol_info {
|
|
addr_t address;
|
|
size_t size;
|
|
};
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
status_t elf_load_user_image(const char *path, Team *team, int flags,
|
|
addr_t *_entry);
|
|
|
|
// these two might get public one day:
|
|
image_id load_kernel_add_on(const char *path);
|
|
status_t unload_kernel_add_on(image_id id);
|
|
|
|
status_t elf_debug_lookup_symbol_address(addr_t address, addr_t *_baseAddress,
|
|
const char **_symbolName, const char **_imageName,
|
|
bool *_exactMatch);
|
|
status_t elf_debug_lookup_user_symbol_address(Team* team, addr_t address,
|
|
addr_t *_baseAddress, const char **_symbolName,
|
|
const char **_imageName, bool *_exactMatch);
|
|
addr_t elf_debug_lookup_symbol(const char* searchName);
|
|
status_t elf_lookup_kernel_symbol(const char* name, elf_symbol_info* info);
|
|
struct elf_image_info* elf_get_kernel_image();
|
|
status_t elf_get_image_info_for_address(addr_t address, image_info* info);
|
|
image_id elf_create_memory_image(const char* imageName, addr_t text,
|
|
size_t textSize, addr_t data, size_t dataSize);
|
|
status_t elf_add_memory_image_symbol(image_id id, const char* name,
|
|
addr_t address, size_t size, int32 type);
|
|
status_t elf_init(struct kernel_args *args);
|
|
|
|
status_t _user_read_kernel_image_symbols(image_id id, elf_sym* symbolTable,
|
|
int32* _symbolCount, char* stringTable, size_t* _stringTableSize,
|
|
addr_t* _imageDelta);
|
|
|
|
status_t _user_lookup_symbol(addr_t address, addr_t* baseAddress,
|
|
char* symbolNameBuffer, size_t symbolNameBufferSize,
|
|
char* imageNameBuffer, size_t imageNameBufferSize,
|
|
bool* exactMatch);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _KERNEL_ELF_H */
|