golang 호출 cgo coredump 획득 방법
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
로 보기 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.