github.com/daludaluking/addr2line@v0.0.0-20180726102841-edf762fb5d97/addr2line_test.go (about)

     1  package addr2line
     2  
     3  import (
     4  	"flag"
     5  	"os"
     6  	"strconv"
     7  	"testing"
     8  )
     9  
    10  var globalT *testing.T
    11  
    12  func printUsage() {
    13  	globalT.Error("usage: addr2line [so library paht] [hexadecimal address]\n\tex) addr2line libc.so 0x493c\n")
    14  }
    15  
    16  func usage() {
    17  	printUsage()
    18  }
    19  
    20  func TestGetAddr2LineEntry(t *testing.T) {
    21  	globalT = t
    22  
    23  	if len(os.Args) < 2 || os.Args[1] == "--help" {
    24  		usage()
    25  	}
    26  
    27  	flag.Usage = usage
    28  	flag.Parse()
    29  
    30  	if flag.NArg() != 2 {
    31  		usage()
    32  		return
    33  	}
    34  
    35  	addressStr := flag.Arg(1)
    36  
    37  	if len(addressStr) > 2 && addressStr[:2] == "0x" {
    38  		addressStr = addressStr[2:]
    39  	}
    40  
    41  	addr, err := strconv.ParseInt(addressStr, 16, 64)
    42  	if err != nil {
    43  		t.Errorf("%v\n", err)
    44  	}
    45  
    46  	e, err := GetAddr2LineEntry(flag.Arg(0), uint(addr), true)
    47  
    48  	if err != nil {
    49  		t.Error(err)
    50  	} else {
    51  		//t.Logf("%v\n", e)
    52  		t.Logf("library  : %s\n", e.SoPath)
    53  		t.Logf("address  : 0x%x\n", e.Address)
    54  		t.Logf("function : %s\n", e.Func)
    55  		t.Logf("file     : %s\n", e.File)
    56  		t.Logf("line     : %d\n", e.Line)
    57  		t.Logf("inline   : %v\n", e.Inline)
    58  	}
    59  }
    60  
    61  func BenchmarkGetAddr2LineEntry(t *testing.B) {
    62  	if len(os.Args) < 2 || os.Args[1] == "--help" {
    63  		usage()
    64  	}
    65  
    66  	flag.Usage = usage
    67  	flag.Parse()
    68  
    69  	if flag.NArg() != 2 {
    70  		usage()
    71  		return
    72  	}
    73  
    74  	addressStr := flag.Arg(1)
    75  
    76  	if len(addressStr) > 2 && addressStr[:2] == "0x" {
    77  		addressStr = addressStr[2:]
    78  	}
    79  
    80  	addr, err := strconv.ParseInt(addressStr, 16, 64)
    81  	if err != nil {
    82  		t.Errorf("%v\n", err)
    83  	}
    84  
    85  	e, err := GetAddr2LineEntry(flag.Arg(0), uint(addr), true)
    86  
    87  	if err != nil {
    88  		t.Error(err)
    89  	} else {
    90  		//t.Logf("%v\n", e)
    91  		t.Logf("library  : %s\n", e.SoPath)
    92  		t.Logf("address  : 0x%x\n", e.Address)
    93  		t.Logf("function : %s\n", e.Func)
    94  		t.Logf("file     : %s\n", e.File)
    95  		t.Logf("line     : %d\n", e.Line)
    96  		t.Logf("inline   : %v\n", e.Inline)
    97  	}
    98  }