2017-01-17 12 views
8

क्या कोई रास्पबेरी पाई अनुकूलित/विशिष्ट बैकट्रैस() कार्यान्वयन है? मैं मानक बैकट्रैक() कोड का उपयोग कर रहा हूं लेकिन my_backtrace फ़ंक्शन से अधिक विस्तृत आउटपुट के लिए तत्पर हूं। इस कोड सेरास्पबेरी पीआई अनुकूलित बैकट्रैस()

void my_backtrace(){ 
    void *stack[10]; 
    int n = backtrace(stack, 10); 
    std::cout << "Last frames==" << n << std::endl; 
    backtrace_symbols_fd(stack, n, STDOUT_FILENO); 
} 

उत्तर

6
//--There is list of options: 
//a) backtrace in combination with abi::__cxa_demangle 
//b) GDB 
//c) [libunwind][1], [http://www.nongnu.org/libunwind/docs.html] 
//d) libbfd-dev 
//e) [backward-cpp][1], [https://github.com/bombela/backward-cpp] 
//f) [libbacktrace][1], [https://github.com/ErwanLegrand/libbacktrace] 
//----------------------------------------------- 
#include <execinfo.h> 
#include <iostream> 
#include <sys/types.h> 
#include <unistd.h> 
#include <sstream> 
#include <sys/wait.h> 
//----------------------------------------------- 
//Based on GDB 
//----------------------------------------------- 
void print_trace_gdb() { 
    char pid_buf[30]; 
    sprintf(pid_buf, "%d", getpid()); 
    char name_buf[512]; 
    name_buf[readlink("/proc/self/exe", name_buf, 511)]=0; 

    int child_pid = fork(); 
    if (!child_pid) {   
     dup2(2,1); // redirect output to stderr 
     fprintf(stdout,"stack trace for %s pid=%s\n",name_buf, pid_buf); 
     execlp("gdb", "gdb", "--batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL); 
     //if gdb failed to start 
     abort(); 
    } else { 
     waitpid(child_pid,NULL,0); 
    } 
} 

//----------------------------------------------- 
void rec_function(int ii) 
{ 
    if (ii == 0) {std::cout << "int value==" << ii << "\n";} 
    else {rec_function(--ii);} 
    print_trace_gdb(); 
} 

//----------------------------------------------- 
int main() 
{ 
    int jj=1; 
    std::cout << "\n---begin test-----\n"; 
    std::cout << "int value==" << jj << "\n"; 
    rec_function(jj); 
    std::cout << "---end test-----\n"; 
} 

आउटपुट

---begin test----- 
int value==1 
int value==0 
stack trace for /opt/cpp/linux_backtrace_gdb pid=4181 
0x00007f878b5ca4ca in waitpid() from /lib/x86_64-linux-gnu/libc.so.6 
[Current thread is 1 (process 4181)] 
#0 0x00007f878b5ca4ca in waitpid() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x0000000000400e69 in print_trace_gdb() at linux_backtrace_gdb.cpp:25 
#2 0x0000000000400ed2 in rec_function (ii=0) at linux_backtrace_gdb.cpp:34 
#3 0x0000000000400ecd in rec_function (ii=0) at linux_backtrace_gdb.cpp:33 
#4 0x0000000000400f29 in main() at linux_backtrace_gdb.cpp:43 
stack trace for /opt/cpp/linux_backtrace_gdb pid=4181 
0x00007f878b5ca4ca in waitpid() from /lib/x86_64-linux-gnu/libc.so.6 
[Current thread is 1 (process 4181)] 
#0 0x00007f878b5ca4ca in waitpid() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x0000000000400e69 in print_trace_gdb() at linux_backtrace_gdb.cpp:25 
#2 0x0000000000400ed2 in rec_function (ii=0) at linux_backtrace_gdb.cpp:34 
#3 0x0000000000400f29 in main() at linux_backtrace_gdb.cpp:43 
---end test----- 
+0

संकलन लाइन है: [जी ++ --std = C++ 11 जी linux_backtrace_gdb.cpp -ओ linux_backtrace_gdb -rdynamic] –

+2

ओह, यक, नहीं! 'बैकट्रैक()' का पूरा बिंदु यह है कि यह प्रक्रिया के भीतर चलता है। 'Gdb' पर शेलिंग करना इसके बारे में जाने का एक बहुत ही खराब तरीका है - यह पूरी प्रक्रिया को रोकने के लिए संभवतः कुछ समय तक रोक देगा, जबकि जीडीबी प्रतीकों को शुरू करता है और लोड करता है। (और इसके लिए जीडीबी को निश्चित रूप से स्थापित करने की आवश्यकता है।) – duskwuff

+0

बैकट्रैस() के साथ आपको लाइन नंबरों को खोजने में चुनौती होगी, जहां आप [abi :: __ cxa_demangle] और/या lib2addr का उपयोग करते समय भी कुछ गलत हुआ। जीडीबी सॉफ्टवेयर के गैर-रिलीज/डीबग संस्करणों के उपयोग के लिए काफी ठीक है। –

संबंधित मुद्दे