2013-12-13 5 views
4

이유가 무엇인지 모르겠지만이 백 트레이스를 볼 수 없습니다. 내 바이너리의 심볼이로드되고 패키지 libc6-dbg이 설치됩니다. libc 심볼을 찾을 위치를 gdb에 알려줘야합니까? 당신의 역 추적에서memcpy backtrace 사용할 수있는 기호가 없음

Program received signal SIGSEGV, Segmentation fault. 
__memcpy_ia32() at ../sysdeps/i386/i686/multiarch/../memcpy.S:74 
74 ../sysdeps/i386/i686/multiarch/../memcpy.S: No such file or directory. 
(gdb) bt full 
#0 __memcpy_ia32() at ../sysdeps/i386/i686/multiarch/../memcpy.S:74 
No locals. 
#1 0x00000000 in ??() 
No symbol table info available. 
(gdb) 
+0

"-g -O0"옵션을 사용하여 빌드 한 적이 있습니까? 반송 주소를 덮어 쓰는 스택 손상이 될 수 있습니까? – jcm

+0

@jcm이 영향을 미칩니 까? – jsj

+0

이진 파일에서 디버그 정보를 트리밍하여 빌더가 응용 프로그램을 최적화하는 것이 가능합니다. '-O0'은 최적화를 불가능하게 만들고 이러한 가능성을 피합니다. 반면에, 백 트레이스의 라인 수에서, 나는 스택 손상에 걸 겠어. 나는 이것을 돕기 위해 답을 추가하려고 노력할 것이다. – jcm

답변

1

, 당신은 당신의 반환 주소를 (이 두 통화의 주로하기 때문에 코드를 호출 방어 적이기에 대한 정보가없는) 덮어 쓰기하는 스택 손상을했습니다 가능성이있다. 스택의 주소에 memcpy을 사용하고있을 가능성이 있습니까? 손상의 종류를 확인하는

한 가지 방법은 watch GDB 명령을 사용하는 것입니다 :

  1. 에서 가장 중요한 부분은 손상 있어야 전화를 구분합니다. 귀하의 경우에는 memcpy를 호출하거나 닫아야합니다.
  2. 일단 의심스러운 기능이 있으면 중단 점을 추가하십시오.
  3. 중단 점에 도달 할 때까지 실행합니다.
  4. 호출 지점의 함수 주소를 다음과 같이 설정하십시오. watch 0xXXXXXX
  5. 감시 점에 도달 할 때까지 실행하십시오.

반송 주소를 덮어 쓰면 데이터베이스 손상이 발생하면 중지해야합니다.