2013-03-19 4 views
1

, 나는 이러한 기능DBX 코어 덤프

void foo(int a, int b, int c); 
void bar(int d); 
void start(); 

이 내가 그래서 줄라고 시작이

foo(<value of a>, <value of b>, <value of c>, <three garbage values>) 
bar(<value of d>, <five garbage values>) 
start(<six garbage values>) 
.... [other functions] 

같이 보입니다 코어 덤프를 얻을 가정 그것은 foo를 불렀고 우리는 foo에 추락했습니다. 질문은 스택의 값들이 각 함수가 호출 될 때 % o1, .., % o5 레지스터의 값을 추적하고 있는지, 아니면 그 시간에 % i0, .., % i5 레지스터의 값을 추적하고 있습니까? (함수가이 입력 레지스터 중 하나를 변경하면 스택 추적의 값이 달라진다는 의미입니다)?

외부 레지스터의 값이라고 생각했기 때문에 고객이 최근에 하드웨어를 업그레이드했으며 스택 추적의 인수 중 하나에 결함이있는 코어 덤프가 있습니다. 호출자에 대한 디스 어셈블리는 해당 특정 인수를 설정하는 데 사용 된 레지스터조차도 올바르게 표시됩니다. 일반적인 유형 불일치, 서명/서명되지 않은 항목 등을 확인했습니다.

답변

0

스택 추적은 대개 스택 프레임의 덤프를 표시합니다. 모든 부름 (동어 반복을 용서하십시오). 함수 매개 변수 뒤에는 반송 주소, 이전 스택 프레임에 대한 포인터 등이 있습니다. 이러한 값은 가비지 값입니다. 스택 레이아웃에 대한 자세한 내용은 Google의 "AIX call conventions"와 유사 할 수 있습니다. 코어 덤프가 생성되면 함수가 호출되었을 때 스택의 값이 무엇인지 알 수 없습니다. 충돌 당시의 값을 볼 수 있습니다. 따라서 함수가 형식 매개 변수에 새 값을 할당하거나 버그 (스택 오버플로 버퍼 오버플로와 같은)로 인해 매개 변수가 덮어 쓰여진 경우 값은 호출 당시 값과 다를 수 있습니다.