This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: setting a breakpoint on a dll, relative path or absolute path issue


I just go a little further, and found that there is a function to look up a file name in symbol tables.

struct symtab * lookup_symtab (const char *name)

the parameter name is the user supplied file name string to set a breakpoint.

This function will loop all the symbols and do a string match.

symtab_to_fullname() is used to read symbol's filename, it was defined in the gdb/source.c line 1110


char * symtab_to_fullname (struct symtab *s) { int r;

  if (!s)
    return NULL;

  /* Don't check s->fullname here, the file could have been
     deleted/moved/..., look for it again.  */
  r = find_and_open_source (s->filename, s->dirname, &s->fullname);

  if (r >= 0)
    {
      close (r);
      return s->fullname;
    }

  return NULL;
}

When loop on the symbols. I found that at one loop, I get

s->filename = "../../src/common/string.cpp"
s->dirname  = "D:\code\wxWidgets-2.8.12\build\msw"

But too badly, the result
s->fullname = "D:\code\wxWidgets-2.8.12\build\msw/../../src/common/string.cpp"


This is the reason about the issue, if the result is:
"D:\code\wxWidgets-2.8.12/src/common/string.cpp"
Then, this problem can be fixed.

I'm not sure why gdb does not give a cannical filename, but still leaves the "../../" in the result.



By the way, gdb's matching algorithm care both "/" and "\" as equivalent char under Windows.

Look at here: gdb\libiberty\filename_cmp.c

int
filename_cmp (const char *s1, const char *s2)
{
#ifndef HAVE_DOS_BASED_FILE_SYSTEM
 return strcmp(s1, s2);
#else
 for (;;)
    {
     int c1 = TOLOWER (*s1);
     int c2 = TOLOWER (*s2);

     /* On DOS-based file systems, the '/' and the '\' are equivalent.  */
     if (c1 == '/')
       c1 = '\\';
     if (c2 == '/')
       c2 = '\\';

     if (c1 != c2)
       return (c1 - c2);

     if (c1 == '\0')
       return 0;

     s1++;
     s2++;
    }
#endif
}


Asmwarrior ollydbg from codeblocks' forum






Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]