Developer forums (C::B DEVELOPMENT STRICTLY!) > Development
new idea: ship the debug symbols in a separate file when we distribute C::B
ollydbg:
Here is the dll test, it works also OK when I separate the debug symbols in the dll.
dll header files:
--- Code: ---#ifndef __DLL_H__
#define __DLL_H__
#include <windows.h>
/* To use this exported function of dll, include this header
* in your project.
*/
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
#ifdef __cplusplus
}
#endif
#endif // __DLL_H__
--- End code ---
dll.cpp file:
--- Code: ---#include "dll.h"
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
int a = 0;
int b = 5;
int c = b/a;
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
--- End code ---
Now, the exe (main.cpp) file needs to adjust like below:
--- Code: ---
/* Public Domain.
*
* A sample C++ program for Dr.MinGW.
*/
#include <stdio.h>
#include <stdlib.h>
#include "exchndl.h"
#include "dll.h"
static void Function(int i, double j, const char * pszString) {
sscanf("12345", "%i", (int *)1);
}
struct Class {
static void StaticMethod(int i, float j) {
Function(i * 2, j, "Hello");
}
void Method(void) {
StaticMethod(4, 5.6f);
}
};
int main() {
ExcHndlInit();
Class instance;
SomeFunction("abc");
//instance.Method();
return 0;
}
--- End code ---
The "test-drmingw.exe" and "test-drmingw-dll.dll" were all put in the "bin/Debug" folder, then I run the command below to separate all the debug symbols:
--- Code: ---objcopy --only-keep-debug test-drmingw.exe test-drmingw.debug
strip --strip-debug --strip-unneeded test-drmingw.exe
objcopy --add-gnu-debuglink test-drmingw.debug test-drmingw.exe
objcopy --only-keep-debug test-drmingw-dll.dll test-drmingw-dll.debug
strip --strip-debug --strip-unneeded test-drmingw-dll.dll
objcopy --add-gnu-debuglink test-drmingw-dll.debug test-drmingw-dll.dll
--- End code ---
The next step is: try to load the dll file from a sub folder, such as "bin/Debug/plugin", put the "test-drmingw-dll.dll" and "test-drmingw-dll.debug" in the "plugin" folder.
ollydbg:
OK, the dynamically loading of the dll and calling the function also works.
To do this, I have:
1, change the main.cpp (the code to generate the exe file) like below:
--- Code: ---#include <stdio.h>
#include <stdlib.h>
#include "exchndl.h"
typedef void (*SomeFunctionPtr)(const LPCSTR);
int main() {
ExcHndlInit();
HMODULE h = LoadLibrary("plugin/test-drmingw-dll.dll");
SomeFunctionPtr f = reinterpret_cast<SomeFunctionPtr>(GetProcAddress(h, "SomeFunction"));
f("abc");
return 0;
}
--- End code ---
and separate the debug symbol of this exe file by calling:
--- Code: ---objcopy --only-keep-debug test-drmingw.exe test-drmingw.debug
strip --strip-debug --strip-unneeded test-drmingw.exe
objcopy --add-gnu-debuglink test-drmingw.debug test-drmingw.exe
--- End code ---
2, now I move the two files "test-drmingw-dll.dll" and "test-drmingw-dll.debug" to a sub-folder "bin/Debug/plugin".
Since those two files were already debug symbol separated files, I do not need to rebuild the dlls.
3, run the exe file, it will crash inside the dll function call, now see whether the "test-drmingw.RPT" in the root folder (the "bin/Debug" folder).
Yes, it does show the correct call stack with source code lines.
Navigation
[0] Message Index
[*] Previous page
Go to full version