colored log, print stacktrace
This commit is contained in:
parent
74935055d0
commit
48b0a4b7d9
8
Makefile
8
Makefile
|
@ -17,18 +17,18 @@ plugins: $(INSTALLDIR)$(NAME)
|
||||||
installplugins: plugins
|
installplugins: plugins
|
||||||
bash testplugins/install.sh
|
bash testplugins/install.sh
|
||||||
|
|
||||||
install: $(INSTALLDIR)$(NAME)
|
install: $(BUILDDIR)$(NAME)
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
sudo rm -f $(INSTALLDIR)$(NAME)
|
sudo rm -f $(INSTALLDIR)$(NAME)
|
||||||
|
|
||||||
link:
|
link: $(BUILDDIR)$(NAME)
|
||||||
sudo ln -s $(realpath $(BUILDDIR)$(NAME)) $(INSTALLDIR)
|
sudo ln -fs $(realpath $(BUILDDIR)$(NAME)) $(INSTALLDIR)
|
||||||
|
|
||||||
$(INSTALLDIR)$(NAME): $(BUILDDIR)$(NAME)
|
$(INSTALLDIR)$(NAME): $(BUILDDIR)$(NAME)
|
||||||
cp $(BUILDDIR)$(NAME) $(INSTALLDIR)
|
cp $(BUILDDIR)$(NAME) $(INSTALLDIR)
|
||||||
|
|
||||||
all: createhfiles $(BUILDDIR)$(NAME)
|
all: createhfiles link
|
||||||
|
|
||||||
$(BUILDDIR)%.so: $(SRCDIR)%.cpp $(BUILDDIR)
|
$(BUILDDIR)%.so: $(SRCDIR)%.cpp $(BUILDDIR)
|
||||||
$(CXX) -fPIC -shared $(CFLAGS) $(SRCDIR)*.cpp -o $@ $(LDFLAGS)
|
$(CXX) -fPIC -shared $(CFLAGS) $(SRCDIR)*.cpp -o $@ $(LDFLAGS)
|
||||||
|
|
|
@ -2,13 +2,32 @@
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#define DEBUG 0
|
||||||
|
#define COLORS 0
|
||||||
|
|
||||||
|
#if COLORS == 1
|
||||||
|
#define CBLUE std::string("\033[94m")
|
||||||
|
#define CRED std::string("\033[91m")
|
||||||
|
#define CYELLOW std::string("\033[93m")
|
||||||
|
#define CGREEN std::string("\033[92m")
|
||||||
|
#define CRESET std::string("\033[0m")
|
||||||
|
#define CGREY std::string("\033[90m")
|
||||||
|
#else
|
||||||
|
#define CBLUE std::string()
|
||||||
|
#define CRED std::string()
|
||||||
|
#define CYELLOW std::string()
|
||||||
|
#define CGREEN std::string()
|
||||||
|
#define CRESET std::string()
|
||||||
|
#define CGREY std::string()
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DEBUG 1
|
|
||||||
|
|
||||||
#if DEBUG == 1
|
#if DEBUG == 1
|
||||||
#define DEB(A) std::cout << A << std::endl
|
#define DEB(A) std::cout << A << CRESET << std::endl
|
||||||
#else
|
#else
|
||||||
#define DEB(A) ;
|
#define DEB(A) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace Plugin {
|
namespace Plugin {
|
||||||
|
|
|
@ -29,6 +29,7 @@ public:
|
||||||
virtual void onDisable(JNIEnv*);
|
virtual void onDisable(JNIEnv*);
|
||||||
virtual std::map<std::string, eventfptr> getEvents();
|
virtual std::map<std::string, eventfptr> getEvents();
|
||||||
virtual ~CppPlugin();
|
virtual ~CppPlugin();
|
||||||
|
void printStacktrace();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function);
|
bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function);
|
||||||
|
|
|
@ -111,7 +111,7 @@ void load(JNIEnv* env, long data) {
|
||||||
+ (!EVENTDATAF) + (!EVENTNAMEF) + (!PLUGINIDF) + (!BUKKITSERVER) + (!SERVERCMDMAP)
|
+ (!EVENTDATAF) + (!EVENTNAMEF) + (!PLUGINIDF) + (!BUKKITSERVER) + (!SERVERCMDMAP)
|
||||||
+ (!MAPGET) + (!MAPPUT) + (!MAPCLEAR) + (!LISTENERCONTR) + (!LISTENERSMALLCONTR) + (!CMDCONSTR) + (!CMDMAPREGISTER)) != 0) {
|
+ (!MAPGET) + (!MAPPUT) + (!MAPCLEAR) + (!LISTENERCONTR) + (!LISTENERSMALLCONTR) + (!CMDCONSTR) + (!CMDMAPREGISTER)) != 0) {
|
||||||
|
|
||||||
DEB("Error loading a Java Information:");
|
DEB(CRED << "Error loading a Java Information:");
|
||||||
DEB("find classes: " << (!!CPPPLUGINCLASS) << (!!EVENTCLASS) << (!!MAPCLASS) << (!!LISTENERCLASS) << (!!CMDCLASS) << (!!BUKKITCLASS) << (!!CBSERVERCLASS) << (!!CMDMAPCLASS));
|
DEB("find classes: " << (!!CPPPLUGINCLASS) << (!!EVENTCLASS) << (!!MAPCLASS) << (!!LISTENERCLASS) << (!!CMDCLASS) << (!!BUKKITCLASS) << (!!CBSERVERCLASS) << (!!CMDMAPCLASS));
|
||||||
DEB("find fields: " << (!!EVENTDATAF) << (!!EVENTNAMEF) << (!!PLUGINIDF) << (!!BUKKITSERVER) << (!!SERVERCMDMAP));
|
DEB("find fields: " << (!!EVENTDATAF) << (!!EVENTNAMEF) << (!!PLUGINIDF) << (!!BUKKITSERVER) << (!!SERVERCMDMAP));
|
||||||
DEB("find methods: " << (!!MAPGET) << (!!MAPPUT) << (!!MAPCLEAR) << (!!LISTENERCONTR) << (!!LISTENERSMALLCONTR) << (!!CMDCONSTR) << (!!CMDMAPREGISTER));
|
DEB("find methods: " << (!!MAPGET) << (!!MAPPUT) << (!!MAPCLEAR) << (!!LISTENERCONTR) << (!!LISTENERSMALLCONTR) << (!!CMDCONSTR) << (!!CMDMAPREGISTER));
|
||||||
|
@ -119,7 +119,7 @@ void load(JNIEnv* env, long data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function) {
|
bool registerCmd(JNIEnv* env, CppPlugin* plugin, std::string& cname, cmdfptr function) {
|
||||||
DEB("Register Cmd " + cname + " for " + plugin->name);
|
DEB(CYELLOW << "Register Cmd " << CGREEN << cname << CYELLOW << " for " << CGREEN << plugin->name);
|
||||||
load(env, JNI_BUKKITCLASS | JNI_SERVERCMDMAPFIELD | JNI_CMDCONSTR | JNI_CMDMAPREGISTERMETH);
|
load(env, JNI_BUKKITCLASS | JNI_SERVERCMDMAPFIELD | JNI_CMDCONSTR | JNI_CMDMAPREGISTERMETH);
|
||||||
|
|
||||||
// create cnd
|
// create cnd
|
||||||
|
@ -163,7 +163,7 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEn
|
||||||
const char* cpath = env->GetStringUTFChars(path, 0);
|
const char* cpath = env->GetStringUTFChars(path, 0);
|
||||||
|
|
||||||
//open plugin
|
//open plugin
|
||||||
DEB("open plugin " << cpath);
|
DEB(CBLUE << "open plugin " << cpath);
|
||||||
void* handle = dlopen(cpath, RTLD_LAZY);
|
void* handle = dlopen(cpath, RTLD_LAZY);
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
std::cout << "could not create handle of: " << cpath << " error: " << dlerror() << std::endl;
|
std::cout << "could not create handle of: " << cpath << " error: " << dlerror() << std::endl;
|
||||||
|
@ -180,25 +180,25 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEn
|
||||||
}
|
}
|
||||||
|
|
||||||
Plugin::CppPlugin* plugin = initf();
|
Plugin::CppPlugin* plugin = initf();
|
||||||
DEB("Initilized");
|
DEB(CGREY << "Initilized");
|
||||||
|
|
||||||
plugin->handle = handle;
|
plugin->handle = handle;
|
||||||
|
|
||||||
//set name / handle id
|
//set name / handle id
|
||||||
plugin->name = std::string(cpath);
|
plugin->name = std::string(cpath);
|
||||||
plugin->name = plugin->name.substr(plugin->name.rfind('/')+1);
|
plugin->name = plugin->name.substr(plugin->name.rfind('/')+1);
|
||||||
DEB("name set");
|
DEB(CGREY << "name set");
|
||||||
|
|
||||||
// add to vector
|
// add to vector
|
||||||
Plugin::plugins.push_back(plugin);
|
Plugin::plugins.push_back(plugin);
|
||||||
int id = Plugin::plugins.size()-1;
|
int id = Plugin::plugins.size()-1;
|
||||||
plugin->id = id;
|
plugin->id = id;
|
||||||
DEB("plugin added to vector");
|
DEB(CGREY << "plugin added to vector");
|
||||||
|
|
||||||
//store id
|
//store id
|
||||||
Plugin::load(env,Plugin:: JNI_ALL);
|
Plugin::load(env,Plugin:: JNI_ALL);
|
||||||
env->SetIntField(thisobj,Plugin:: PLUGINIDF, id);
|
env->SetIntField(thisobj,Plugin:: PLUGINIDF, id);
|
||||||
DEB("Internal id set");
|
DEB(CGREY << "Internal id set");
|
||||||
|
|
||||||
return (bool) plugin; // converted to boolean here
|
return (bool) plugin; // converted to boolean here
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,7 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_loadPlugin(JNIEn
|
||||||
* Signature: ()V
|
* Signature: ()V
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env, jobject thisobj) {
|
JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env, jobject thisobj) {
|
||||||
DEB("lib::onLoad()");
|
DEB(CGREY << "lib::onLoad()");
|
||||||
Plugin::getPlugin(env, thisobj)->onLoad(env);
|
Plugin::getPlugin(env, thisobj)->onLoad(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onLoad(JNIEnv* env,
|
||||||
* Signature: ()V
|
* Signature: ()V
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* env, jobject thisobj) {
|
JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* env, jobject thisobj) {
|
||||||
DEB("lib::onEnable()");
|
DEB(CGREY << "lib::onEnable()");
|
||||||
Plugin::getPlugin(env, thisobj)->onEnable(env);
|
Plugin::getPlugin(env, thisobj)->onEnable(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,7 +230,7 @@ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onEnable_1(JNIEnv* e
|
||||||
*/
|
*/
|
||||||
JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv* env, jobject thisobj) {
|
JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv* env, jobject thisobj) {
|
||||||
//TODO
|
//TODO
|
||||||
DEB("lib::onDisable()" );
|
DEB(CGREY << "lib::onDisable()");
|
||||||
Plugin::CppPlugin* plugin = Plugin::getPlugin(env, thisobj);
|
Plugin::CppPlugin* plugin = Plugin::getPlugin(env, thisobj);
|
||||||
plugin->onDisable(env);
|
plugin->onDisable(env);
|
||||||
dlclose(plugin->handle);
|
dlclose(plugin->handle);
|
||||||
|
@ -242,9 +242,9 @@ JNIEXPORT void JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onDisable_1(JNIEnv*
|
||||||
* Signature: (Lde/mrbesen/cppplugins/CppEvent;I)Lde/mrbesen/cppplugins/CppEvent;
|
* Signature: (Lde/mrbesen/cppplugins/CppEvent;I)Lde/mrbesen/cppplugins/CppEvent;
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv* env, jobject thisobj, jobject jevent, jlong functionid) {
|
JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv* env, jobject thisobj, jobject jevent, jlong functionid) {
|
||||||
DEB("lib::fireEvent()" );
|
DEB(CGREY << "lib::fireEvent()");
|
||||||
if(functionid == 0) {
|
if(functionid == 0) {
|
||||||
DEB("invalid function id");
|
DEB(CRED << "invalid function id");
|
||||||
return jevent;
|
return jevent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,8 +256,16 @@ JNIEXPORT jobject JNICALL Java_de_mrbesen_cppplugins_CppPlugin_fireEvent(JNIEnv*
|
||||||
//cast event
|
//cast event
|
||||||
Plugin::Event event(env, jevent);
|
Plugin::Event event(env, jevent);
|
||||||
|
|
||||||
|
//get Plugin
|
||||||
|
Plugin::CppPlugin* plugin = Plugin::getPlugin(env, thisobj);
|
||||||
|
|
||||||
//call it
|
//call it
|
||||||
f(env, Plugin::getPlugin(env, thisobj), &event);
|
try {
|
||||||
|
f(env, plugin, &event);
|
||||||
|
} catch(...) {
|
||||||
|
std::cout << CRED << "Error while processing Event " << event.getName() << " in plugin: " << plugin->name << CRESET << std::endl;
|
||||||
|
return jevent;
|
||||||
|
}
|
||||||
|
|
||||||
//put changed fields back in the jevent
|
//put changed fields back in the jevent
|
||||||
event.reapply(env, jevent);
|
event.reapply(env, jevent);
|
||||||
|
@ -291,7 +299,7 @@ JNIEXPORT jboolean JNICALL Java_de_mrbesen_cppplugins_CppPlugin_onCmd(JNIEnv* en
|
||||||
try {
|
try {
|
||||||
result = cmdf(env, plugin, sender, cmd, clabel, cargs);
|
result = cmdf(env, plugin, sender, cmd, clabel, cargs);
|
||||||
} catch(...) {
|
} catch(...) {
|
||||||
std::cout << "Error while executing Command " << clabel << " in plugin: " << plugin->name << std::endl;
|
std::cout << CRED << "Error while executing Command " << clabel << " in plugin: " << plugin->name << CRESET << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,13 +316,13 @@ JNIEXPORT jobjectArray JNICALL Java_de_mrbesen_cppplugins_CppPlugin_getListener(
|
||||||
|
|
||||||
//call getEvents
|
//call getEvents
|
||||||
std::map<std::string, Plugin::eventfptr> events = Plugin::getPlugin(env, thisobj)->getEvents();
|
std::map<std::string, Plugin::eventfptr> events = Plugin::getPlugin(env, thisobj)->getEvents();
|
||||||
DEB("found " << events.size() << " Events");
|
DEB(CYELLOW << "found " << events.size() << " Events" );
|
||||||
|
|
||||||
//create array
|
//create array
|
||||||
jobject initial = env->NewObject(Plugin::LISTENERCLASS, Plugin::LISTENERSMALLCONTR);
|
jobject initial = env->NewObject(Plugin::LISTENERCLASS, Plugin::LISTENERSMALLCONTR);
|
||||||
jobjectArray arr = env->NewObjectArray(events.size(), Plugin::LISTENERCLASS, initial);
|
jobjectArray arr = env->NewObjectArray(events.size(), Plugin::LISTENERCLASS, initial);
|
||||||
|
|
||||||
DEB("populate array");
|
DEB(CGREY << "populate array" );
|
||||||
//populate array
|
//populate array
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(auto it : events) {
|
for(auto it : events) {
|
||||||
|
@ -327,7 +335,7 @@ JNIEXPORT jobjectArray JNICALL Java_de_mrbesen_cppplugins_CppPlugin_getListener(
|
||||||
env->SetObjectArrayElement(arr, i++, listener);
|
env->SetObjectArrayElement(arr, i++, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEB("Array finished");
|
DEB(CGREY << "Array finished" );
|
||||||
|
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
|
@ -1,6 +1,9 @@
|
||||||
#include <plugin.h>
|
#include <plugin.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <execinfo.h> //backtrace
|
||||||
|
|
||||||
|
#define STACKTRACEBUFFER 100
|
||||||
|
|
||||||
namespace Plugin {
|
namespace Plugin {
|
||||||
|
|
||||||
|
@ -17,7 +20,7 @@ void CppPlugin::onDisable(JNIEnv*) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, eventfptr> CppPlugin::getEvents() {
|
std::map<std::string, eventfptr> CppPlugin::getEvents() {
|
||||||
std::cout << "Defaults::getEvents()" << std::endl;
|
//std::cout << "Defaults::getEvents()" << std::endl;
|
||||||
return std::map<std::string, eventfptr>();
|
return std::map<std::string, eventfptr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,5 +28,27 @@ CppPlugin::~CppPlugin() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CppPlugin::printStacktrace() {
|
||||||
|
//create stacktrace
|
||||||
|
void *buffer[STACKTRACEBUFFER];
|
||||||
|
int count = backtrace(buffer, STACKTRACEBUFFER)-1; //dont print current frame
|
||||||
|
|
||||||
|
std::cout << "Plugin: " << name << " Creating Stacktrace: ";
|
||||||
|
std::cout << count << " Frames traced\n";
|
||||||
|
|
||||||
|
char** strings = nullptr;
|
||||||
|
|
||||||
|
strings = backtrace_symbols(buffer+1, count);
|
||||||
|
|
||||||
|
if(strings == nullptr) {
|
||||||
|
std::cout << "Error, could not read symbols - compiled with \"-g\"?" << std::endl;
|
||||||
|
} else {
|
||||||
|
for(int i = 0; i < count; i++) {
|
||||||
|
std::cout << strings[i] << "\n";
|
||||||
|
}
|
||||||
|
free(strings);
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} //namespace
|
} //namespace
|
||||||
|
|
Loading…
Reference in New Issue