내 바이너리를 돌릴 때 GDB가 배열을 덤프하지 않는다는 것이 이상하게 느껴졌는데 왜 이것이 실행 파일의 일부에서만 발생하는지 알지 못합니다.GDB가 배열을 인쇄하지 않는 이유는 무엇입니까?
선언은 매우 간단합니다 :
tbl_account_t accounts[MAX_ACCOUNTS];
내가 배열 (다만 어떤 배열)을 인쇄 할 때,이 얻을 : 변수 유형을 확인
(gdb) print accounts
$16 = 0x618d20 <accounts>
이 모든 것이 괜찮 :
(gdb) ptype accounts
type = struct tbl_account {
unsigned short email_len;
unsigned short password_len;
char auto_log_in;
char reserved_char[3];
int reserved_int;
char email[64];
char password[25];
} []
(gdb)
데이터가 있습니다 :
(gdb) print accounts[1]
$18 = {email_len = 16, password_len = 3, auto_log_in = 0 '\000', reserved_char = "\000\000", reserved_int = 0, email = "[email protected]", '\000' <repeats 47 times>,
password = "123", '\000' <repeats 21 times>}
(gdb)
"print accounts"명령을 사용하면 다른 실행 파일 에서처럼 전체 배열 내용을 덤프해야합니다. 왜 이런 일이 생길까요?
감사합니다 많은 문제가 무엇인지 알아 내도록 도왔습니다. main.c에 "constants.h"라는 헤더가 없으므로 MAX_ACCOUNTS가 내 소스 코드에서 선언되었습니다. GCC의 경우 이것은 문제가 아니므로 컴파일 오류가 없습니다. 그러나 분명히 GDB는 include의 하위 계층 구조에서 심볼 정의를 찾지 않습니다. #include "constants.h"를 main.c 자체에 추가함으로써 GDB는 accounts [] 배열의 크기를 알 수 있었고 지금은 괜찮습니다. – Nulik
나는 이것의 진정한 원인을 발견했다. 그것은 "constants.h"를 포함하지 않았습니다.라이브러리 함수 (내 자신의 라이브러리이지만 완전히 다른 공유 객체) 내에서 코드를 추적하고 라이브러리에서 다음 선언을 사용하는 경우가 발생합니다. "extern tbl_account_t accounts []"이것은 포인터 만 인쇄 된 이유입니다. – Nulik
하! extern guess와 함께 찍은 –