b check_prime if k >= 9
check_prime 함수의 인자가 9로 들어올 때에만, 호출문에 break point를 걸겠다.
근데 내 환경의 경우엔
기본적으로 check_prime 앞에서 s를 통해 step into 했을 때, check_prime의 인자인 k가 처음엔 쓰레기값이다.
이후 n을 해야만, 넘겨진 값이 찍히게 되었다. 따라서 저 위의 conditional 코드로는 제대로 된 check_prime함수의 시작점을 알 수 없었다... 다르게 해주어야 했다.
뭐라는 거냐면, 내가 배운 동영상에서는
check_prime(N) 앞에서 step into 하면, k 값이 제대로 잘 전달되면서 찍히나, 나는 맨 처음에는 쓰레기값으로 찍힌다는 것이다.
따라서
내가 배운 동영상에서는 b check_prime if k >= 9가, check_prime(9) 시작될 때 잘 찍히겠지만
내 환경의 경우에서는 check_prime 호출부에 break 해봤자 곧바로 k가 9로 넘겨지지 않고 n을 해야 찍히기 때문에
시작점을 잡을 수 없다는 것. 다른 방법으로 잡아주어야 했다..
즉
내 환경에서는 check_prime 앞에서 step into 하면, 곧바로 check_prime 함수의 첫번째 줄로 들어가는 것이 아니라
check_prime 함수 선언부를 실행하기 전의 코드부분으로 이동하는 의미인 것이므로, 그림에서 6이 실행되지 않았기에
k에도 쓰레기값이 들어가게 되는 것인데
동영상의 경우에는 s 하자마자 곧바로 check_prime함수 코드부를 찾아서 '들어간 상태' 가 되므로 k에 값이 들어간 상황인 것이다.
따라서 나는 아래처럼 주어서 해결했다!! 이러면 된다.
b prime.c:7 if k >= 9
next와 step을 반복하는 과정이, 실제 내부에서 작동하는 과정이라고 생각하면 된다. 그리고 눈으로 본 것 처럼 차이가 있었기에 실제로 문제가 있었던 것이다.
동영상의 버전에서는 특정 함수 앞에서 s를 해보면 그 함수 안으로 곧바로 들어가며, 이때 인자값까지 제대로 전달된 상황인데
내 버전에서는 그 함수의 정의 코드부 첫번째 줄 실행 전으로 이동하기에, 인자값까지 제대로 전달되지 못하는 상황이다.
따라서
b check_prime if k >= 9
위 명령어가, 동영상 버전에서는 check_prime(9)가 호출되는 그 순간(s 들어온 상태)에서 k = 9가 잘 인식되었지만
내 버전에서는 check_prime이 호출되어서 실제 s로 들어간 상황 그 순간에는 함수 구현부 첫번째 줄을 가리키고 있겠으므로 인자값 9를 제대로 인지하지 못한다. step 과정을 내가 한 것처럼 시스템에서도 똑같이 거치는 거고 그 순간의 차이로 인해 이렇게 된다는 것이다.
+ break A는 A 이전까지 실행하며 A 앞에서 멈춘다는 것은 두 버전도 동일하다. 오해금지.
마지막으로 아래는, 내 버전에서 맨 위처럼 conditional break point를 걸었을 때의 이해를 돕기 위한 자료.
내가 손으로 해보면서 깨달았던 흐름 그대로, s로 진입했던 그 순간에 k 대입이 아직 진행되지 않은 6번째 줄 기준으로 도출되기에, 제대로 통하지 않음을 알 수 있다.
+ 코드엔 문제 없고, gdb 버전 차이인듯함. 내 gdb가 더 상위 버전이다. 상위 버전에서는 맨 위 코드로는 안되니, 저대로 활용하려면 추가로 무언가 해주어야 하는듯?
'[리눅스]' 카테고리의 다른 글
gdb 명령어 (0) | 2021.09.16 |
---|---|
vi 명령어 (0) | 2021.09.16 |
gdb break point & next(=n) & step into(=s) (0) | 2021.09.16 |
gdb 화면 비우기 (0) | 2021.09.16 |
vi에서 라인 번호 노출시키기 (0) | 2021.09.16 |