3 AĞUSTOS 2011, ÇARŞAMBA
Geri iz yapmak nasıl()/backtrace_symbols() işlevi adlarını yazdırmak?
Linux özel backtrace()
backtrace_symbols()
programın Ara bir iz üretmek için izin verir. Ancak, bu sadece benim program için fonksiyon adreslerini, isimlerini yazdırır. Nasıl işlev adları onlara baskı da yapabilir miyim ? -g
-ggdb
ile program derleme çalıştım. Test durumu aşağıda sadece bu baskılar
BACKTRACE ------------ ./a.out() [0x8048616] ./a.out() [0x8048623] /lib/libc.so.6(__libc_start_main 0xf3) [0x4a937413] ./a.out() [0x8048421] ----------------------
İlk 2 madde de fonksiyon isimlerini göstermek istiyorum, foo
main
Kod:
#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;
}
CEVAP
4 AĞUSTOS 2011, PERŞEMBE
Semboller dinamik sembol tablosundan alınmıştır; bunu sağlayan bağlayıcı bir bayrak geçiş yapar gcc
-rdynamic
seçeneği gerekirtümsemboller tablosuna yerleştirilir.
(**12, / Link Options sayfa glibc manual. Backtraces sayfasına bakınız)
Bunu Paylaş:
Nasıl bir MySQL geri yükleme yapmak is...
Nasıl bir denetleyici işlevi görünümle...
Nasıl bir işlevi, bir geri arama kulla...
Nasıl variadic bir şablon işlevi heter...
Nasıl formu gönderdikten sonra bir Wor...