in source/posix/system_info.c [251:303]
int s_parse_symbol(const char *symbol, void *addr, struct aws_stack_frame_info *frame) {
/* symbols look like: <exe-or-shared-lib>(<function>+<addr>) [0x<addr>]
* or: <exe-or-shared-lib> [0x<addr>]
* or: [0x<addr>]
*/
(void)addr;
const char *open_paren = strstr(symbol, "(");
const char *close_paren = strstr(symbol, ")");
const char *exe_end = open_paren;
/* there may not be a function in parens, or parens at all */
if (open_paren == NULL || close_paren == NULL) {
exe_end = strstr(symbol, "[");
if (!exe_end) {
return AWS_OP_ERR;
}
/* if exe_end == symbol, there's no exe */
if (exe_end != symbol) {
exe_end -= 1;
}
}
ptrdiff_t exe_len = exe_end - symbol;
if (exe_len > 0) {
strncpy(frame->exe, symbol, exe_len);
}
s_whitelist_chars(frame->exe);
long function_len = (open_paren && close_paren) ? close_paren - open_paren - 1 : 0;
if (function_len > 0) { /* dynamic symbol was found */
/* there might be (<function>+<addr>) or just (<function>) */
const char *function_start = open_paren + 1;
const char *plus = strstr(function_start, "+");
const char *function_end = (plus) ? plus : close_paren;
if (function_end > function_start) {
function_len = function_end - function_start;
strncpy(frame->function, function_start, function_len);
} else if (plus) {
long addr_len = close_paren - plus - 1;
strncpy(frame->addr, plus + 1, addr_len);
}
}
if (frame->addr[0] == 0) {
/* use the address in []'s, since it's all we have */
const char *addr_start = strstr(exe_end, "[") + 1;
char *addr_end = strstr(addr_start, "]");
if (!addr_end) {
return AWS_OP_ERR;
}
strncpy(frame->addr, addr_start, addr_end - addr_start);
}
return AWS_OP_SUCCESS;
}