2012-04-23 3 views
17

gdb는 이미 선언 된 변수가 이 명령을 사용하여으로 설정되도록 허용한다는 것을 알고 있습니다.GDB를 사용하여 주어진 함수의 범위에서 변수를 선언하는 방법은 무엇입니까?

gdb가 주어진 함수의 범위 내에서 새로운 변수를 동적으로 선언 할 수 있습니까?

+10

무슨 좋은 할 것 : 여기

그러나 그것은 당신이 출력 매개 변수에 대한 포인터를 취 기능 FUNC를()있을 때, 같은 모습입니다? 이 코드는 그 존재를 인식하지 못합니다. –

+0

어쨌든 @JamesMcLaughlin과 동의하십시오. ** no **, 검사 용입니다. –

+6

gdb 변수를 사용 하시겠습니까? 'set $ foo = ...'와 나중에'$ foo'를 참조 할 수 있도록 편의를 위해 gdb 환경에서 변수를 생성 할 수 있습니다. 물론 이러한 변수는 실행중인 코드에서 전혀 볼 수 없습니다. – FatalError

답변

14

C (및 아마도 C++) 코드의 경우 대부분의 구현에서 스택 포인터를 이동해야하므로 코드의 크기와 더 이상 맞지 않아 함수의 종료 코드가 실패하게되므로 매우 어려울 것입니다. 스택 프레임. 또한 지역 변수에 액세스하는 함수의 모든 코드가 갑자기 잘못된 위치에 도달 할 위험이 있으며 나쁜 편입니다.

그래서 나는 그렇게 생각하지 않습니다.

6

은 내가 당신이 동적으로 공간을 할당 할 수있는 변수

(gdb) set $path=((ngx_path_t  **)ngx_cycle->paths.elts)[2] 
(gdb) print *$path 
    $16 = { 
     name = { 
      len = 29, 
      data = 0x80ed15c "/usr/local/nginx/fastcgi_temp" 
      }, 
     len = 5, 
     level = {1, 2, 0}, 
     manager = 0, 
     loader = 0, 
     data = 0x0, 
     conf_file = 0x0, 
     line = 0 
    } 
12

를 인쇄하고 새 변수를 저장하는 데 사용하는 데 사용되는 방법입니다. "현재 함수의 범위"란 무엇을 의미 하느냐에 따라 원하는 결과가 아닐 수도 있습니다.

set $foo = alloc(sizeof(struct funcOutStruct)) 
func($foo) 
p *$foo 
free($foo) 
관련 문제