implement external interface to library and use it in tests. need to be
reworked a bit to use file descriptor or buffer provided to callse
This commit is contained in:
+1
-1
@@ -31,7 +31,7 @@ SOFT_BUILD = $(shell STR=`cat $(BUILD_DIR)/version.h 2> /dev/null | grep 'SOFT_B
|
||||
DATE_BUILD = $(shell date +"%D %T")
|
||||
|
||||
#source and header files search path. add here new directories which contains files specified for $(SRC)
|
||||
VPATH = . dwarf arch utils
|
||||
VPATH = ./ ./dwarf ./arch ./utils
|
||||
|
||||
SRC = $(wildcard $(addsuffix /*.cpp,${VPATH}))
|
||||
OBJ = $(patsubst %.cpp,%.o,$(addprefix $(BUILD_DIR)/,$(notdir $(SRC))))
|
||||
|
||||
@@ -151,10 +151,6 @@ bool print_expr_block (pst_context* ctx, Dwarf_Op *exprs, int exprlen, Dwarf_Att
|
||||
|
||||
void pst_context_init(pst_context* ctx, ucontext_t* hctx)
|
||||
{
|
||||
// global
|
||||
pst_alloc_init(&allocator);
|
||||
pst_log_init_console(&logger);
|
||||
|
||||
// methods
|
||||
ctx->clean_print = clean_print;
|
||||
ctx->print = print;
|
||||
@@ -184,10 +180,6 @@ void pst_context_fini(pst_context* ctx)
|
||||
ctx->frame = NULL;
|
||||
ctx->dwfl = NULL;
|
||||
ctx->module = NULL;
|
||||
|
||||
// global
|
||||
pst_log_fini(&logger);
|
||||
pst_alloc_fini(&allocator);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* libpst.c
|
||||
*
|
||||
* Created on: Feb 5, 2020
|
||||
* Author: nnosov
|
||||
*/
|
||||
|
||||
#include <ucontext.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "utils/allocator.h"
|
||||
#include "dwarf/dwarf_handler.h"
|
||||
|
||||
// allocate and initialize libpst handler.
|
||||
pst_handler* pst_new_handler(ucontext_t* hctx)
|
||||
{
|
||||
// global
|
||||
pst_alloc_init(&allocator);
|
||||
pst_log_init_console(&logger);
|
||||
|
||||
pst_new(pst_handler, handler, hctx);
|
||||
return handler;
|
||||
}
|
||||
|
||||
// deallocate libpst handler
|
||||
void pst_del_handler(pst_handler* h)
|
||||
{
|
||||
pst_free(h);
|
||||
|
||||
// global
|
||||
pst_log_fini(&logger);
|
||||
pst_alloc_fini(&allocator);
|
||||
}
|
||||
|
||||
// write stack trace information to provided file descriptor
|
||||
int pst_unwind_simple(pst_handler* h, FILE* fd)
|
||||
{
|
||||
int ret = pst_handler_unwind(h);
|
||||
if(ret) {
|
||||
fwrite(h->ctx.buff, 1, strlen(h->ctx.buff), fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// save stack trace information to provided buffer in RAM
|
||||
int pst_unwind_simple(pst_handler* h, char* buff, uint32_t buff_size)
|
||||
{
|
||||
int ret = pst_handler_unwind(h);
|
||||
if(ret) {
|
||||
uint32_t cnt = buff_size < sizeof(h->ctx.buff) ? buff_size : sizeof(h->ctx.buff);
|
||||
memcpy(buff, h->ctx.buff, cnt - 2);
|
||||
buff[cnt - 1] = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// write stack trace information to provided file descriptor
|
||||
int pst_unwind_pretty(pst_handler* h, FILE* fd)
|
||||
{
|
||||
int ret = pst_handler_handle_dwarf(h);
|
||||
if(ret) {
|
||||
pst_handler_print_dwarf(h);
|
||||
fwrite(h->ctx.buff, 1, strlen(h->ctx.buff), fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// save stack trace information to provided buffer in RAM
|
||||
int pst_unwind_pretty(pst_handler* h, char* buff, uint32_t buff_size)
|
||||
{
|
||||
int ret = pst_handler_handle_dwarf(h);
|
||||
if(ret) {
|
||||
pst_handler_print_dwarf(h);
|
||||
uint32_t cnt = buff_size < sizeof(h->ctx.buff) ? buff_size : sizeof(h->ctx.buff);
|
||||
memcpy(buff, h->ctx.buff, cnt - 2);
|
||||
buff[cnt - 1] = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
Reference in New Issue
Block a user