golang 호출 cgo coredump 획득 방법

1541 단어 golangcgo
잘못된 c 프로그램 쓰기
package dlsym

import "testing"

func Test_intercept(t *testing.T) {
    Intercept("gethostbyname\x00")
}
package dlsym

// #cgo CFLAGS: -I.
// #include 
// #include "dlsym_wrapper.h"
import "C"
import "unsafe"

func Intercept(symbol string) {
    ptr := unsafe.Pointer(&([]byte(symbol)[0]))
    C.intercept((*C.char)(ptr), C.size_t(len(symbol)))
}
#include 
#include 
#include 

void intercept(char *symbol, size_t symbol_len) {
    symbol = NULL; // will cause SIGSEGV
    printf("%s
", symbol); fflush(stdout); }

실행 가능 한 파일 로 컴 파일 테스트
go test -c github.com/taowen/go-lib c/dlsym
# will produce executable dlsym.test

이것 은 coredump 를 분석 할 때 기호 표를 얻어 사용 하 는 것 입 니 다.
테스트 실행, coredump 획득
GOTRACEBACK=crash ./dlsym.test
# produced /tmp/core_dlsym.test.29937

coredump 의 위 치 를 찾 지 못 하면 실행 하기 전에 coredump 의 쓰기 조건 을 설정 합 니 다.
echo '/tmp/core_%e.%p' | sudo tee /proc/sys/kernel/core_pattern
ulimit -c unlimited # coredump can be any large

gdb 로 coredump 분석
gdb dlsym.test /tmp/core_dlsym.test /tmp/core_dlsym.test.29937
  • bt full 모든 프레임 보기
  • 지 정 된 프레임 frame 으로 보기
  • 지 정 된 변수의 값 을 print 로 보기
  • 좋은 웹페이지 즐겨찾기