This is the mail archive of the gdb@sources.redhat.com 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]

Setting breakpoints in a virtual function on a dynamically loaded DLL


Hi,

I'm trying to set a breakpoint in a virtual function (new_foo::bar())
implemented in a DLL (testdll.dll) which I load dynamically from an .exe
(fooloader.exe). I get the following errors:

$ gdb fooloader.exe
...
(gdb) shared testdll.dll
(gdb)
(gdb) break new_foo::bar
Error: Cannot access memory at address 0x010001014

If I forcibly set a breakpoint at new_foo::bar using the GUI, I get an
error dialog that says "cannot insert breakpoint 1:" and the message
"Error: Cannot access memory at address 0x01000101e" in the console
window.

My question is:
1. Is there any way at all to set a breakpoint in the testdll.dll?
2. Did I doing something silly? The code is very simple and it steps
correctly under the MSVC debugger.

I'm running gdb 5.0 with the Insight GUI on cygwin 1.3.10 on a windows
box. Any help is greatly appreciated!!!

The 3 files listed below are compiled and linked using:

c++ -g -DVERBOSE -DWIN32 -DDLL_EXPORT -I.   -c -o fooloader.o
fooloader.cpp
c++ -g -DVERBOSE -DWIN32 -DDLL_EXPORT -I.   -c -o testdll.o testdll.cpp
c++ -shared -o testdll.dll -mwindows --export-all testdll.o
/lib/libstdc++.a
c++ -o fooloader.exe fooloader.o

--------------------------foo.h -------------------------
class foo {
public:
   virtual void bar() = 0;
};

-----------------------testdll.cpp-----------------------
#include <stdio.h>
#include "foo.h"

#ifdef __cplusplus
extern "C" {
#endif

void *create_object();

#ifdef __cplusplus
}
#endif

class new_foo : foo {
public:
   void bar();
};

void new_foo::bar() {
   printf("in new_foo::bar()\n");
}

void *create_object() {
   return (void *)new new_foo; 
}

-----------------------fooloader.cpp------------------------
#include <windows.h>
#include "foo.h"

typedef void *(*CREATE_OBJECT)();

int main() {
   HMODULE module = LoadLibrary("testdll.dll");
   CREATE_OBJECT create_foo = (CREATE_OBJECT)GetProcAddress(module,
"create_object");
	
   foo *my_foo = (foo *)(create_foo)();
   my_foo->bar();
}



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