mirror of
https://github.com/reactos/reactos.git
synced 2025-04-26 16:40:27 +00:00
Update log2lines to version 1.5. Jan Roeloffzen, bug #4342.
svn path=/trunk/; revision=44363
This commit is contained in:
parent
e2e8b52413
commit
0c2fe0a124
1 changed files with 158 additions and 34 deletions
|
@ -10,11 +10,12 @@
|
||||||
|
|
||||||
#include "rsym.h"
|
#include "rsym.h"
|
||||||
|
|
||||||
#define LOG2LINES_VERSION "1.4"
|
#define LOG2LINES_VERSION "1.5"
|
||||||
|
|
||||||
#define INVALID_BASE 0xFFFFFFFFL
|
#define INVALID_BASE 0xFFFFFFFFL
|
||||||
|
|
||||||
#define DEF_OPT_DIR "output-i386"
|
#define DEF_OPT_DIR "output-i386"
|
||||||
|
#define SOURCES_ENV "_ROSBE_ROSSOURCEDIR"
|
||||||
|
|
||||||
#if defined (__DJGPP__) || defined (__WIN32__)
|
#if defined (__DJGPP__) || defined (__WIN32__)
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
"%s x -y -r %s" PATH_STR "reactos" PATH_STR "reactos.cab -o%s" PATH_STR "reactos" PATH_STR "reactos > " DEV_NULL
|
"%s x -y -r %s" PATH_STR "reactos" PATH_STR "reactos.cab -o%s" PATH_STR "reactos" PATH_STR "reactos > " DEV_NULL
|
||||||
|
|
||||||
#define LINESIZE 1024
|
#define LINESIZE 1024
|
||||||
|
#define NAMESIZE 80
|
||||||
|
|
||||||
#define log(outFile, fmt, ...) \
|
#define log(outFile, fmt, ...) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -90,13 +92,26 @@ struct summ_struct
|
||||||
int total;
|
int total;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct lineinfo_struct
|
||||||
|
{
|
||||||
|
int valid;
|
||||||
|
char file1[LINESIZE];
|
||||||
|
char func1[NAMESIZE];
|
||||||
|
int nr1;
|
||||||
|
char file2[LINESIZE];
|
||||||
|
char func2[NAMESIZE];
|
||||||
|
int nr2;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct cache_struct CACHE;
|
typedef struct cache_struct CACHE;
|
||||||
typedef struct summ_struct SUMM;
|
typedef struct summ_struct SUMM;
|
||||||
|
typedef struct lineinfo_struct LINEINFO;
|
||||||
|
|
||||||
static CACHE cache;
|
static CACHE cache;
|
||||||
static SUMM summ;
|
static SUMM summ;
|
||||||
|
static LINEINFO lastLine;
|
||||||
|
|
||||||
static char *optchars = "bcd:fFhl:mMrstTuUvz:";
|
static char *optchars = "bcd:fFhl:mMrsS:tTuUvz:";
|
||||||
static int opt_buffered= 0; // -b
|
static int opt_buffered= 0; // -b
|
||||||
static int opt_help = 0; // -h
|
static int opt_help = 0; // -h
|
||||||
static int opt_force = 0; // -f
|
static int opt_force = 0; // -f
|
||||||
|
@ -107,6 +122,7 @@ static int opt_mark = 0; // -m
|
||||||
static int opt_Mark = 0; // -M
|
static int opt_Mark = 0; // -M
|
||||||
static int opt_raw = 0; // -r
|
static int opt_raw = 0; // -r
|
||||||
static int opt_stats = 0; // -s
|
static int opt_stats = 0; // -s
|
||||||
|
static int opt_Source = 0; // -S
|
||||||
static int opt_twice = 0; // -t
|
static int opt_twice = 0; // -t
|
||||||
static int opt_Twice = 0; // -T
|
static int opt_Twice = 0; // -T
|
||||||
static int opt_undo = 0; // -u
|
static int opt_undo = 0; // -u
|
||||||
|
@ -120,6 +136,63 @@ static FILE *logFile = NULL;
|
||||||
static char *cache_name;
|
static char *cache_name;
|
||||||
static char *tmp_name;
|
static char *tmp_name;
|
||||||
|
|
||||||
|
static char sources_path[LINESIZE];
|
||||||
|
|
||||||
|
static void
|
||||||
|
clearLastLine(void)
|
||||||
|
{
|
||||||
|
memset(&lastLine, 0, sizeof(LINEINFO));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
log_file(FILE *outFile, char *fileName, int max )
|
||||||
|
{
|
||||||
|
int i = 0, min = 0;
|
||||||
|
char s[LINESIZE];
|
||||||
|
char p[LINESIZE];
|
||||||
|
FILE *src;
|
||||||
|
|
||||||
|
strcpy(p, sources_path);
|
||||||
|
strcat(p, fileName);
|
||||||
|
if ((src = fopen(p, "r")))
|
||||||
|
{
|
||||||
|
min = max - opt_Source;
|
||||||
|
min = (min < 0) ? 0 : min;
|
||||||
|
while (i < max && fgets(s, LINESIZE, src))
|
||||||
|
{
|
||||||
|
if (i >= min)
|
||||||
|
log(outFile, "| %4.4d %s", i + 1, s);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
fclose(src);
|
||||||
|
}
|
||||||
|
else if (opt_verbose)
|
||||||
|
fprintf(stderr, "Can't open: %s (check " SOURCES_ENV ")\n", p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
logSource(FILE *outFile)
|
||||||
|
{
|
||||||
|
log_file(outFile, lastLine.file1, lastLine.nr1);
|
||||||
|
if (lastLine.nr2)
|
||||||
|
{
|
||||||
|
log(outFile, "| ---- [%u] ----\n", lastLine.nr2);
|
||||||
|
log_file(outFile, lastLine.file2, lastLine.nr2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
reportSource(FILE *outFile)
|
||||||
|
{
|
||||||
|
if (!opt_Source)
|
||||||
|
return;
|
||||||
|
if (lastLine.valid)
|
||||||
|
{
|
||||||
|
logSource(outFile);
|
||||||
|
}
|
||||||
|
clearLastLine();
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
basename(char *path)
|
basename(char *path)
|
||||||
{
|
{
|
||||||
|
@ -206,17 +279,24 @@ print_offset(void *data, size_t offset, char *toString)
|
||||||
}
|
}
|
||||||
if (e || e2)
|
if (e || e2)
|
||||||
{
|
{
|
||||||
|
strcpy(lastLine.file1, &Strings[e->FileOffset]);
|
||||||
|
strcpy(lastLine.func1, &Strings[e->FunctionOffset]);
|
||||||
|
lastLine.nr1 = e->SourceLine;
|
||||||
|
lastLine.valid = 1;
|
||||||
if (e2)
|
if (e2)
|
||||||
{
|
{
|
||||||
|
strcpy(lastLine.file2, &Strings[e2->FileOffset]);
|
||||||
|
strcpy(lastLine.func2, &Strings[e2->FunctionOffset]);
|
||||||
|
lastLine.nr2 = e2->SourceLine;
|
||||||
bFileOffsetChanged = e->FileOffset != e2->FileOffset;
|
bFileOffsetChanged = e->FileOffset != e2->FileOffset;
|
||||||
if (e->FileOffset != e2->FileOffset || e->FunctionOffset != e2->FunctionOffset)
|
if (e->FileOffset != e2->FileOffset || e->FunctionOffset != e2->FunctionOffset)
|
||||||
summ.majordiff++;
|
summ.majordiff++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* - "%.0s" displays nothing, but processes argument
|
* - "%.0s" displays nothing, but processes argument
|
||||||
* - bFileOffsetChanged implies always display 2nd SourceLine even if the same
|
* - bFileOffsetChanged implies always display 2nd SourceLine even if the same
|
||||||
* - also for FunctionOffset
|
* - also for FunctionOffset
|
||||||
*/
|
*/
|
||||||
strcat(fmt, "%s");
|
strcat(fmt, "%s");
|
||||||
if (bFileOffsetChanged)
|
if (bFileOffsetChanged)
|
||||||
strcat(fmt, "[%s]");
|
strcat(fmt, "[%s]");
|
||||||
|
@ -238,23 +318,23 @@ print_offset(void *data, size_t offset, char *toString)
|
||||||
if (toString)
|
if (toString)
|
||||||
{ // put in toString if provided
|
{ // put in toString if provided
|
||||||
snprintf(toString, LINESIZE, fmt,
|
snprintf(toString, LINESIZE, fmt,
|
||||||
&Strings[e->FileOffset],
|
&Strings[e->FileOffset],
|
||||||
&Strings[e2->FileOffset],
|
&Strings[e2->FileOffset],
|
||||||
(unsigned int)e->SourceLine,
|
(unsigned int)e->SourceLine,
|
||||||
(unsigned int)e2->SourceLine,
|
(unsigned int)e2->SourceLine,
|
||||||
&Strings[e->FunctionOffset],
|
&Strings[e->FunctionOffset],
|
||||||
&Strings[e2->FunctionOffset]);
|
&Strings[e2->FunctionOffset]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcat(fmt, "\n");
|
strcat(fmt, "\n");
|
||||||
printf(fmt,
|
printf(fmt,
|
||||||
&Strings[e->FileOffset],
|
&Strings[e->FileOffset],
|
||||||
&Strings[e2->FileOffset],
|
&Strings[e2->FileOffset],
|
||||||
(unsigned int)e->SourceLine,
|
(unsigned int)e->SourceLine,
|
||||||
(unsigned int)e2->SourceLine,
|
(unsigned int)e2->SourceLine,
|
||||||
&Strings[e->FunctionOffset],
|
&Strings[e->FunctionOffset],
|
||||||
&Strings[e2->FunctionOffset]);
|
&Strings[e2->FunctionOffset]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -262,16 +342,16 @@ print_offset(void *data, size_t offset, char *toString)
|
||||||
if (toString)
|
if (toString)
|
||||||
{ // put in toString if provided
|
{ // put in toString if provided
|
||||||
snprintf(toString, LINESIZE, "%s:%u (%s)",
|
snprintf(toString, LINESIZE, "%s:%u (%s)",
|
||||||
&Strings[e->FileOffset],
|
&Strings[e->FileOffset],
|
||||||
(unsigned int)e->SourceLine,
|
(unsigned int)e->SourceLine,
|
||||||
&Strings[e->FunctionOffset]);
|
&Strings[e->FunctionOffset]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("%s:%u (%s)\n",
|
printf("%s:%u (%s)\n",
|
||||||
&Strings[e->FileOffset],
|
&Strings[e->FileOffset],
|
||||||
(unsigned int)e->SourceLine,
|
(unsigned int)e->SourceLine,
|
||||||
&Strings[e->FunctionOffset]);
|
&Strings[e->FunctionOffset]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -831,9 +911,19 @@ translate_line(FILE *outFile, char *Line, char *path, char *LineOut)
|
||||||
|
|
||||||
if (!*Line)
|
if (!*Line)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
res = 1;
|
res = 1;
|
||||||
mark = "";
|
mark = "";
|
||||||
s = remove_mark(Line);
|
s = remove_mark(Line);
|
||||||
|
if (opt_undo)
|
||||||
|
{
|
||||||
|
/* Strip all lines added by this tool: */
|
||||||
|
char buf[NAMESIZE];
|
||||||
|
if (sscanf(s, "| %s", buf) == 1)
|
||||||
|
if (buf[0] == '0' || strcmp(buf, "----") == 0 || atoi(buf))
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
|
||||||
sep = strchr(s, ':');
|
sep = strchr(s, ':');
|
||||||
if (sep)
|
if (sep)
|
||||||
{
|
{
|
||||||
|
@ -947,6 +1037,7 @@ translate_files(FILE *inFile, FILE *outFile)
|
||||||
translate_line(outFile, Line, path, LineOut);
|
translate_line(outFile, Line, path, LineOut);
|
||||||
i = 0;
|
i = 0;
|
||||||
translate_char(c, outFile);
|
translate_char(c, outFile);
|
||||||
|
reportSource(outFile);
|
||||||
break;
|
break;
|
||||||
case '<':
|
case '<':
|
||||||
i = 0;
|
i = 0;
|
||||||
|
@ -1005,6 +1096,7 @@ translate_files(FILE *inFile, FILE *outFile)
|
||||||
if (!opt_raw)
|
if (!opt_raw)
|
||||||
{
|
{
|
||||||
translate_line(outFile, Line, path, LineOut);
|
translate_line(outFile, Line, path, LineOut);
|
||||||
|
reportSource(outFile);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1075,20 +1167,27 @@ static char *verboseUsage =
|
||||||
" - Offset error: Image exists, but error retrieving offset info.\n"
|
" - Offset error: Image exists, but error retrieving offset info.\n"
|
||||||
" - Total: Total number of lines attempted to translate.\n"
|
" - Total: Total number of lines attempted to translate.\n"
|
||||||
" Also some version info is displayed.\n\n"
|
" Also some version info is displayed.\n\n"
|
||||||
" -t Translate twice. The address itself and for (address - 1)\n"
|
" -S <context>\n"
|
||||||
|
" Source lines. Display up to <context> lines until linenumber.\n"
|
||||||
|
" The environment variable _ROSBE_ROSSOURCEDIR should be correctly set.\n"
|
||||||
|
" For a reliable result, these sources should be up to date with\n"
|
||||||
|
" the revision you test.\n"
|
||||||
|
" Can be combined with -tT.\n"
|
||||||
|
" Implies -U. Retranslation needed for retrieving source info.\n\n"
|
||||||
|
" -t Translate twice. The address itself and for (address - 1).\n"
|
||||||
" Show extra filename, func and linenumber between [..] if they differ\n"
|
" Show extra filename, func and linenumber between [..] if they differ\n"
|
||||||
" So if only the linenumbers differ, then only show the extra\n"
|
" So if only the linenumbers differ, then only show the extra\n"
|
||||||
" linenumber.\n\n"
|
" linenumber.\n\n"
|
||||||
" -T As -t, but the original filename+func+linenumber gets replaced\n\n"
|
" -T As -t, but show only filename+func+linenumber for (address - 1.)\n\n"
|
||||||
" -u Undo translations.\n"
|
" -u Undo translations.\n"
|
||||||
" Lines are translated back (reverted) to the form <IMAGENAME:ADDRESS>\n"
|
" Lines are translated back (reverted) to the form <IMAGENAME:ADDRESS>\n"
|
||||||
" Overrides console mode -c.\n\n"
|
" Also removes all lines previously added by this tool (see -S)\n\n"
|
||||||
" -U Undo and reprocess.\n"
|
" -U Undo and reprocess.\n"
|
||||||
" Reverted to the form <IMAGENAME:ADDRESS>, and then retranslated\n"
|
" Reverted to the form <IMAGENAME:ADDRESS>, and then retranslated\n"
|
||||||
" Overrides console mode -c, implies -u.\n\n"
|
" Implies -u.\n\n"
|
||||||
" -v Show detailed errors and tracing.\n"
|
" -v Show detailed errors and tracing.\n"
|
||||||
" Repeating this option adds more verbosity.\n"
|
" Repeating this option adds more verbosity.\n"
|
||||||
" Default: only (major) errors\n" "\n\n"
|
" Default: only (major) errors\n\n"
|
||||||
" -z <path to 7z>\n"
|
" -z <path to 7z>\n"
|
||||||
" Specify path to 7z. See also option -d.\n"
|
" Specify path to 7z. See also option -d.\n"
|
||||||
" Default: '7z'\n"
|
" Default: '7z'\n"
|
||||||
|
@ -1113,6 +1212,14 @@ static char *verboseUsage =
|
||||||
" The following command line invocations are equivalent:\n"
|
" The following command line invocations are equivalent:\n"
|
||||||
" log2lines msi.dll 2e35d msi.dll 2235 msiexec.exe 30a8 msiexec.exe 2e89\n"
|
" log2lines msi.dll 2e35d msi.dll 2235 msiexec.exe 30a8 msiexec.exe 2e89\n"
|
||||||
" log2lines msi.dll 2e35d 2235 msiexec.exe 30a8 2e89\n\n"
|
" log2lines msi.dll 2e35d 2235 msiexec.exe 30a8 2e89\n\n"
|
||||||
|
" Generate source lines from backtrace ('bt') output. Show 2 lines of context:\n"
|
||||||
|
" log2lines -S 2 -d bootcd-38701-dbg.7z < bugxxxx.log\n"
|
||||||
|
" <msiexec.exe:2e89 (lib/3rdparty/mingw/crtexe.c:259 (__tmainCRTStartup))>\n"
|
||||||
|
" | 0258 #else\n"
|
||||||
|
" | 0259 mainret = main (\n"
|
||||||
|
" <msiexec.exe:2fad (lib/3rdparty/mingw/crtexe.c:160 (WinMainCRTStartup))>\n"
|
||||||
|
" | 0159 return __tmainCRTStartup ();\n"
|
||||||
|
" | 0160 }\n"
|
||||||
"\n";
|
"\n";
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1277,6 +1384,14 @@ main(int argc, const char **argv)
|
||||||
int opt;
|
int opt;
|
||||||
int optCount = 0;
|
int optCount = 0;
|
||||||
int i;
|
int i;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
strcpy(sources_path, "");
|
||||||
|
if ((s = getenv(SOURCES_ENV)))
|
||||||
|
{
|
||||||
|
strcpy(sources_path, s);
|
||||||
|
strcat(sources_path, PATH_STR);
|
||||||
|
}
|
||||||
|
|
||||||
strcpy(opt_scanned, "");
|
strcpy(opt_scanned, "");
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
|
@ -1289,6 +1404,7 @@ main(int argc, const char **argv)
|
||||||
strcpy(opt_7z, CMD_7Z);
|
strcpy(opt_7z, CMD_7Z);
|
||||||
|
|
||||||
memset(&summ, 0, sizeof(SUMM));
|
memset(&summ, 0, sizeof(SUMM));
|
||||||
|
clearLastLine();
|
||||||
|
|
||||||
while (-1 != (opt = getopt(argc, (char **const)argv, optchars)))
|
while (-1 != (opt = getopt(argc, (char **const)argv, optchars)))
|
||||||
{
|
{
|
||||||
|
@ -1332,6 +1448,10 @@ main(int argc, const char **argv)
|
||||||
case 's':
|
case 's':
|
||||||
opt_stats++;
|
opt_stats++;
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
optCount++;
|
||||||
|
opt_Source = atoi(optarg);
|
||||||
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
opt_twice++;
|
opt_twice++;
|
||||||
break;
|
break;
|
||||||
|
@ -1360,9 +1480,12 @@ main(int argc, const char **argv)
|
||||||
}
|
}
|
||||||
optCount++;
|
optCount++;
|
||||||
}
|
}
|
||||||
if (opt_undo)
|
if (opt_Source)
|
||||||
opt_console = 0;
|
{
|
||||||
|
/* need to retranslate for source info: */
|
||||||
|
opt_undo++;
|
||||||
|
opt_redo++;
|
||||||
|
}
|
||||||
argc -= optCount;
|
argc -= optCount;
|
||||||
if (check_directory(opt_force))
|
if (check_directory(opt_force))
|
||||||
return 3;
|
return 3;
|
||||||
|
@ -1413,6 +1536,7 @@ main(int argc, const char **argv)
|
||||||
if (opt_verbose > 1)
|
if (opt_verbose > 1)
|
||||||
fprintf(stderr, "translating %s %s\n", base, offset);
|
fprintf(stderr, "translating %s %s\n", base, offset);
|
||||||
translate_file(base, my_atoi(offset), NULL);
|
translate_file(base, my_atoi(offset), NULL);
|
||||||
|
reportSource(stdout);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue