瀏覽代碼

* Fixed a crash when freeing memory of pets
* Added Cygwin support to the -DDUMPSTACK option, and changed its format
* Removed duplicate fopen in login_log

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1250 54d463be-8e91-2dee-dedb-b68131a5f0ec

celest 20 年之前
父節點
當前提交
244c817d0d
共有 4 個文件被更改,包括 59 次插入40 次删除
  1. 4 0
      Changelog-SVN.txt
  2. 53 38
      src/common/core.c
  3. 0 1
      src/login/login.c
  4. 2 1
      src/map/pet.c

+ 4 - 0
Changelog-SVN.txt

@@ -1,6 +1,10 @@
 Date	Added
 
 03/18
+        * Fixed a crash when freeing memory of pets [celest]
+        * Added Cygwin support to the -DDUMPSTACK option, and changed its format
+          to "<server type><number>.stackdump", thanks to Ser [celest]
+        * Removed duplicate fopen in login_log [celest]
         * Don't log SQL char actions if log_char is not enabled in char_athena.conf
           [celest]
         * Updated shop_exp's calculation to give more exp, thanks to tcdiem [celest]

+ 53 - 38
src/common/core.c

@@ -26,6 +26,10 @@
 #include "memwatch.h"
 #endif
 
+char server_type[24];
+int runflag = 1;
+unsigned long ticks = 0; // by MC Cameri
+char pid_file[256];
 static void (*term_func)(void)=NULL;
 
 /*======================================
@@ -100,42 +104,58 @@ static void sig_proc(int sn)
  *	Dumps the stack using glibc's backtrace
  *-----------------------------------------
  */
-#ifdef CYGWIN 
-	#define sig_dump SIG_DFL	// allow cygwin's default dumper utility to handle this
-#else
-static void sig_dump(int sn)
-{
-	#ifdef DUMPSTACK
-		FILE *fp;
+#ifndef DUMPSTACK
+	#define sig_dump SIG_DFL
+#else	
+	#ifdef CYGWIN
+		#define FOPEN_ freopen
+		extern void cygwin_stackdump();
+	#else
+		#define FOPEN_(fn,m,s) fopen(fn,m)
+	#endif
+extern const char *strsignal(int);
+void sig_dump(int sn)
+{	
+	FILE *fp;
+	char file[256];
+	int no = 0;
+	
+	#ifndef CYGWIN
 		void* array[20];
-
 		char **stack;
-		size_t size;		
-		int no = 0;
-		char tmp[256];
-
-		// search for a usable filename
-		do {
-			sprintf(tmp,"log/stackdump_%04d.txt", ++no);
-		} while((fp = fopen(tmp,"r")) && (fclose(fp), no < 9999));
-		// dump the trace into the file
-		if ((fp = fopen (tmp,"w")) != NULL) {
-
-			fprintf(fp,"Exception: %s\n", strsignal(sn));
-			fprintf(fp,"Stack trace:\n");
-			size = backtrace (array, 20);
-			stack = backtrace_symbols (array, size);
-			for (no = 0; no < size; no++) {
-				fprintf(fp, "%s\n", stack[no]);
-			}
-			fprintf(fp,"End of stack trace\n");
-
-			fclose(fp);
-			aFree(stack);
+		size_t size;
+	#endif
+
+	// search for a usable filename
+	do {
+		sprintf (file, "log/%s%04d.stackdump", server_type, ++no);
+	} while((fp = fopen(file,"r")) && (fclose(fp), no < 9999));
+	// dump the trace into the file
+
+	if ((fp = FOPEN_(file, "w", stderr)) != NULL) {
+		printf ("Dumping stack... ");
+		fprintf(fp, "Exception: %s \n", strsignal(sn));
+		fflush (fp);
+
+
+	#ifdef CYGWIN		
+		cygwin_stackdump ();
+	#else
+		fprintf(fp, "Stack trace:\n");
+		size = backtrace (array, 20);
+		stack = backtrace_symbols (array, size);
+		for (no = 0; no < size; no++) {
+			fprintf(fp, "%s\n", stack[no]);
 		}
+		fprintf(fp,"End of stack trace\n");
+		aFree(stack);
 	#endif
-	//cygwin_stackdump ();
-	// When pass the signal to the system's default handler
+
+		printf ("Done.\n");
+		fflush(stdout);
+		fclose(fp);		
+	}
+	// Pass the signal to the system's default handler
 	compat_signal(sn, SIG_DFL);
 	raise(sn);
 }
@@ -202,11 +222,6 @@ static void display_title(void)
  *--------------------------------------
  */
 
-int runflag = 1;
-unsigned long ticks = 0; // by MC Cameri
-char pid_file[256];
-char server_type[24];
-
 void pid_delete(void) {
 	unlink(pid_file);
 }
@@ -289,7 +304,7 @@ int main(int argc,char **argv)
 
 	display_title();
 
-#ifndef BCHECK
+#ifdef USE_MEMMGR
 	do_init_memmgr(argv[0]); // 一番最初に実行する必要がある
 #endif
 

+ 0 - 1
src/login/login.c

@@ -189,7 +189,6 @@ int login_log(char *fmt, ...) {
 		if(!log_fp)
 			log_fp = fopen(login_log_filename, "a");
 
-		log_fp = fopen(login_log_filename, "a");
 		if (log_fp) {
 			if (fmt[0] == '\0') // jump a line if no message
 				fprintf(log_fp, RETCODE);

+ 2 - 1
src/map/pet.c

@@ -610,7 +610,8 @@ int pet_remove_map(struct map_session_data *sd)
 			pet_hungry_timer_delete(sd);
 		clif_clearchar_area(&sd->pd->bl,0);
 		map_delblock(&sd->pd->bl);
-		free(sd->pd->lootitem);
+		if (sd->pd->lootitem)
+			aFree(sd->pd->lootitem);
 		map_deliddb(&sd->pd->bl);
 	}
 	return 0;