2016-11-22 7 views
0

C++ 프로그램을 프로파일 링하기위한 systemtap 스크립트를 작성했습니다. systemtap 스크립트에서 클래스 멤버를 추출하려고합니다.systemtap 사용자 문자열 복사 오류

스크립트가 실행
probe process("/trade/ans_bu").statement("*@entrust.cpp:6614") 
{ 
    g_custno = @cast(FldOrder, "CFldOrder")->cust_no->buf 
} 

, 그것은이 프로브에 실패했다 "사용자 : 여기

class CFldOrder 
{ 
public: 
    ByteArray cust_no; 
}; 

class ByteArray 
{ 
public: 
    const char* get_value(){return buf;} 
private: 
    char* buf[255]; 
}; 

이 SystemTap의 스크립트의 코드입니다 : 여기

는 C++ 클래스 정의입니다 문자열 복사 오류 (addr 0x0000075 "). 나는 그것이 "@cast (FldOrder,"CFldOrder ") -> cust_no-> buf"가 유효한 주소가 아님을 의미합니다.

이 프로그램을 gdb로 디버그하고 "entrust.cpp : 6614"위치에서 중단하면 FldOrder.cust_no.buf가 올바르게 표시됩니다.

스크립트를 어떻게 수정합니까?

답변

0

귀하의 식별자 FldOlder은 초기화 된 값이 0 인 문자열로 해석되는 스크립트 변수 일뿐입니다. @cast 표현식은 포인터 계산을 숨겨 0x00000075 주소를 얻습니다. 정확히 & ((CFldOlder*)0)->cust_no->buf을 인쇄하면 C++에서 얻을 수있는 것과 같습니다.

스크립트를 수정하려면 @cast에 유효한 포인터를 전달하십시오. 아마도 컨텍스트 변수 $FldOlder을 의미했을 것입니다. 변수 유형이 이미 CFldOlder* 인 경우 @cast (C++ reinterpret_cast<>과 같이 작동)조차 필요하지 않을 수도 있습니다.