C: const initializer and debugging symbols -
in code reviews ask option (1) below used results in symbol being created (for debugging) whereas (2) , (3) not appear @ least gcc , icc. (1) not true const , cannot used on compilers array size. there better option includes debug symbols , const c?
symbols:
gcc f.c -ggdb3 -g ; nm -a a.out | grep _sym 0000000100000f3c s _syma 0000000100000f3c - 04 0000 stsym _syma code:
static const int syma = 1; // 1 #define symb 2 // 2 enum { symc = 3 }; // 3 gdb output:
(gdb) p syma $1 = 1 (gdb) p symb no symbol "symb" in current context. (gdb) p symc no symbol "symc" in current context. and completeness, source:
#include <stdio.h> static const int syma = 1; #define symb 2 enum { symc = 3 }; int main (int argc, char *argv[]) { printf("syma %d symb %d symc %d\n", syma, symb, symc); return (0); }
the -ggdb3 option should giving macro debugging information. different kind of debugging information (it has different - tells debugger how expand macro, possibly including arguments , # , ## operators) can't see nm.
if goal have shows in nm, guess can't use macro. that's silly goal; should want have works in debugger, right? try print symc in gdb , see if works.
since macros can redefined, gdb requires program stopped @ location macro existed can find correct definition. in program:
#include <stdio.h> int main(void) { #define x 1 printf("%d\n", x); #undef x printf("---\n"); #define x 2 printf("%d\n", x); } if break on first printf , print x you'll 1; next second printf , gdb tell there no x; next again , show 2.
also gdb command info macro foo can useful, if foo macro takes arguments , want see definition rather expand specific set of arguments. , if macro expands that's not expression, gdb can't print info macro thing can it.
for better inspection of raw debugging information, try objdump -w instead of nm.
Comments
Post a Comment