Skip to content

Use python3. Apply ImageBase address - #2

Open
rlcevg wants to merge 1 commit into
beyond-all-reason:mainfrom
rlcevg:fix_dll
Open

Use python3. Apply ImageBase address#2
rlcevg wants to merge 1 commit into
beyond-all-reason:mainfrom
rlcevg:fix_dll

Conversation

@rlcevg

@rlcevg rlcevg commented Dec 28, 2021

Copy link
Copy Markdown
Contributor

Warning: stacktrace_translator.py became python3.
Added to ignore local virtualenv files.
pip install -r requirements.txt installs requirements (only pefile and its dependency so far).

EXEBASE is unfortunately global, as required only once for spring.exe module.

Running as XMLRPC server was not tested.

@Beherith

Copy link
Copy Markdown
Contributor

I tested it with engine 714, and this infolog (that is known to crash in Barb), and I got an empty translation, even for engine symbols.

https://logs.springrts.com/logfiles/7471/

Result of translation:
`

module address file line
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9f08daf ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9f3a980 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9f31a19 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9f36870 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9eb405b ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9f0cf3a ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9ea5fe8 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9ead6c3 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\AI\Skirmish\BARb\stable\SkirmishAI.dll 0x20aa9ea23f7 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x2084058e79b ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x20840593fc5 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x2084056aec1 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x2084002fee8 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x2084014face ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x20840037545 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x208404c2a7c ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x208404c5de8 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x208404ae70c ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x208400013c1 ?? 0
C:\Users\Administrator\AppData\Local\Programs\Beyond-All-Reason\data\engine\105.1.1-714-ge909643 bar\spring.exe 0x208400014d6 ?? 0
`

@Beherith Beherith closed this Dec 30, 2021
@Beherith

Copy link
Copy Markdown
Contributor

How did you test without xmlrpc? As i tested with it.

@Beherith Beherith reopened this Dec 30, 2021
@rlcevg

rlcevg commented Dec 30, 2021

Copy link
Copy Markdown
Contributor Author

It works with fixed Win64 crash-handler. 105.1.1-714-ge909643 doesn't provide exe load address

beyond-all-reason/RecoilEngine@925e1ed
engine >= 105.1.1-718-g925e1ed required


Local test without xmlrpc: stacktrace_translator.py <infolog.txt> <dir_with_spring_dbg.7z>
example when everything in the same folder:
$ python3 stacktrace_translator.py infolog.txt ./

@rlcevg

rlcevg commented Dec 30, 2021

Copy link
Copy Markdown
Contributor Author

For DLLs infolog stores only offsets from ImageBase, thus it's safe to assume that it will never be > low 32bit (4GB dll won't happen soon).

Comment thread stacktrace_translator.py
pe = pefile.PE(name=tempfile.name, fast_load=True)
image_base = pe.OPTIONAL_HEADER.ImageBase
load_base = 0 if module.endswith('.dll') else EXEBASE
return [hex(int(x, 16) - load_base + image_base) for x in addresses]

@rlcevg rlcevg Dec 30, 2021

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return [hex(int(x, 16) & 0xFFFFFFFF - load_base + image_base) for x in addresses]
could work for current broken crashhandler, but it would be unexplained hax. Also exe in this case would require different treatment

@Beherith

Beherith commented Jan 1, 2022

Copy link
Copy Markdown
Contributor

Ok, thanks dude, ill deploy once we update engine :)

@rlcevg

rlcevg commented Jan 8, 2022

Copy link
Copy Markdown
Contributor Author

This can be useful, as parsing some infolog crashed:

diff --git a/stacktrace_translator.py b/stacktrace_translator.py
index 2ae4d37..a4857b6 100644
--- a/stacktrace_translator.py
+++ b/stacktrace_translator.py
@@ -353,7 +353,12 @@ def translate_module_addresses(module, debugarchive, addresses, debugfile):
                        if psu in file:
                                file = file[file.index(psu)+len(psu):]
                                break
-               return module, addr, file, int(line)
+               line_int = line
+               try:
+                       line_int = int(line)
+               except ValueError:
+                       pass
+               return module, addr, file, line_int
 
        return [fixup(addr, *line.split(':')) for addr, line in zip(addresses, stdout.decode('utf-8').splitlines())]

But i don't know why int(line) required at all, shouldn't raw line value work? so not PRing additional monstrosity.

@rlcevg

rlcevg commented Feb 14, 2022

Copy link
Copy Markdown
Contributor Author

So, it's time to apply this PR.
Next translations are nonsense:
https://github.com/beyond-all-reason/BARbarIAn/issues/16
https://github.com/beyond-all-reason/BARbarIAn/issues/17

First line after spring passes control to AI from rts/ExternalAI/SkirmishAIHandler.h should be https://github.com/rlcevg/CircuitAI/blob/49b99e9cc5617ea985bd35facccde0816d60c384/src/AIExport.cpp#L75:

(gdb) info line *(0x3a9ea0000 + 0x23f7)
Line 75 of "/spring/AI/Skirmish/BARb/src/AIExport.cpp" starts at address 0x3a9ea23f7 <handleEvent(int, int, void const*)+151>
   and ends at 0x3a9ea23f8 <handleEvent(int, int, void const*)+152>.

@Beherith

Copy link
Copy Markdown
Contributor

Ok, bumping priority on this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants