লিনাক্স নির্দিষ্ট backtrace()
এবং backtrace_symbols()
আপনাকে প্রোগ্রামটির একটি কল ট্রেস তৈরি করতে দেয় to তবে এটি কেবলমাত্র প্রোগ্রামের ঠিকানাগুলি মুদ্রণ করে, আমার প্রোগ্রামের জন্য তাদের নাম নয়। আমি কীভাবে তাদের ফাংশনটির নাম মুদ্রণ করতে পারি? আমি -g
পাশাপাশি প্রোগ্রামটি সংকলন করার চেষ্টা করেছি -ggdb
। নীচের পরীক্ষার কেসটি কেবল এটি মুদ্রণ করে:
পটভূমি ------------ ./a.out () [0x8048616] ./a.out () [0x8048623] /lib/libc.so.6(__libc_start_main+0xf3) [0x4a937413] ./a.out () [0x8048421] ----------------------
আমি প্রথম দুটি আইটেমগুলিও ফাংশনের নামগুলি প্রদর্শন করতে চাই foo
এবংmain
কোড:
#include <execinfo.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
static void full_write(int fd, const char *buf, size_t len)
{
while (len > 0) {
ssize_t ret = write(fd, buf, len);
if ((ret == -1) && (errno != EINTR))
break;
buf += (size_t) ret;
len -= (size_t) ret;
}
}
void print_backtrace(void)
{
static const char start[] = "BACKTRACE ------------\n";
static const char end[] = "----------------------\n";
void *bt[1024];
int bt_size;
char **bt_syms;
int i;
bt_size = backtrace(bt, 1024);
bt_syms = backtrace_symbols(bt, bt_size);
full_write(STDERR_FILENO, start, strlen(start));
for (i = 1; i < bt_size; i++) {
size_t len = strlen(bt_syms[i]);
full_write(STDERR_FILENO, bt_syms[i], len);
full_write(STDERR_FILENO, "\n", 1);
}
full_write(STDERR_FILENO, end, strlen(end));
free(bt_syms);
}
void foo()
{
print_backtrace();
}
int main()
{
foo();
return 0;
}