Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.RuntimeException: Method code too large! #22

Open
CalvinEng opened this issue Jul 29, 2015 · 11 comments
Open

java.lang.RuntimeException: Method code too large! #22

CalvinEng opened this issue Jul 29, 2015 · 11 comments
Assignees
Labels

Comments

@CalvinEng
Copy link

The following is the error I encountered.

There are 1 methods fail to translate.
2015-07-29 03:53:53 UTC
version: [dex-reader-2.0, dex-reader-api-2.0, dex-ir-2.0, d2j-smali-2.0, d2j-base-cmd-2.0, dex-tools-2.0, dex-translator-2.0]
cmdline: [com.nxp.nfc.tagwriter.apk]
env:
java.runtime.name: Java(TM) SE Runtime Environment
java.vm.version: 25.45-b02
java.vm.vendor: Oracle Corporation
java.vendor.url: http://java.oracle.com/
java.vm.name: Java HotSpot(TM) Client VM
java.vm.specification.name: Java Virtual Machine Specification
java.runtime.version: 1.8.0_45-b15
java.awt.graphicsenv: sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs: C:\Program Files (x86)\Java\jre1.8.0_45\lib\endorsed
java.io.tmpdir: C:\Users\Calvin\AppData\Local\Temp
java.vm.specification.vendor: Oracle Corporation
java.library.path: C:\ProgramData\Oracle\Java\javapath;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\Softing\OPCToolbox\V43x\Windows\bin;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Intel\iCLS Client;C:\Program Files\Intel\iCLS Client;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;c:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\TortoiseSVN\bin;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn;c:\Program Files\Microsoft SQL Server\100\Tools\Binn;c:\Program Files\Microsoft SQL Server\100\DTS\Binn;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE;c:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\120\Tools\Binn;C:\Program Files\Microsoft SQL Server\120\DTS\Binn;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\ManagementStudio;C:\Program Files (x86)\Microsoft SQL Server\120\DTS\Binn;C:\Program Files\Microsoft SQL Server\110\Tools\Binn;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit;C:\Program Files\Microsoft\Web Platform Installer;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0;C:\Program Files (x86)\QuickTime\QTSystem;C:\Program Files (x86)\Skype\Phone;C:\Program Files\nodejs;C:\Program Files (x86)\Git\cmd;C:\Program Files (x86)\Git\bin;C:\Program Files (x86)\Brackets\command;C:\Users\Calvin\AppData\Roaming\npm;.
java.specification.name: Java Platform API Specification
java.class.version: 52.0
java.awt.printerjob: sun.awt.windows.WPrinterJob
java.specification.version: 1.8
java.class.path: C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\antlr-runtime-3.5.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\asm-debug-all-4.1.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\d2j-base-cmd-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\d2j-jasmin-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\d2j-smali-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dex-ir-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dex-reader-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dex-reader-api-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dex-tools-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dex-translator-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dex-writer-2.0.jar;C:\Users\Calvin\Desktop\My Workspace\Maxpro\dex2jar-2.0\lib\dx-1.7.jar;
java.vm.specification.version: 1.8
java.home: C:\Program Files (x86)\Java\jre1.8.0_45
java.specification.vendor: Oracle Corporation
java.vm.info: mixed mode
java.version: 1.8.0_45
java.ext.dirs: C:\Program Files (x86)\Java\jre1.8.0_45\lib\ext;C:\Windows\Sun\Java\lib\ext
java.vendor: Oracle Corporation
java.vendor.url.bug: http://bugreport.sun.com/bugreport/

@pxb1988
Copy link
Owner

pxb1988 commented Jul 29, 2015

please also attach the m0.txt in the zip file

@CalvinEng
Copy link
Author

Github doesn't seems to have the option to upload files other than pictures, so I have uploaded the error zip file to google drive. Please look at the attached link.

https://drive.google.com/file/d/0B2U4p41RgtjKRFM2YWIwYW1SanM/view?usp=sharing

@pxb1988 pxb1988 added the bug label Jul 29, 2015
@pxb1988 pxb1988 self-assigned this Jul 29, 2015
@pxb1988 pxb1988 changed the title Error use d2j-dex2jar.bat java.lang.RuntimeException: Method code too large! Jul 29, 2015
@pxb1988
Copy link
Owner

pxb1988 commented Jul 29, 2015

the method Lcom/nxp/nfc/tagwriter/gc;.<clinit>()V contains an array, the array size is huge, so the generated instruction can't fit in a .class method.

@devpilot
Copy link

Encounted java.lang.RuntimeException: Method code too large!
Uploaded Classes-error.zip on google drive
https://drive.google.com/open?id=0B0uVD6vxUmjySEhJSmVSSVM2eTA

@TamilanPeriyasamy
Copy link

Hi pxb thanks for ur good Job .. I am in new for this circle.

I got same issue. How solve... I am use dex2jar 2.0.

@GroverChouT
Copy link

I have same problem. I'm using dex2jar Nightly build for dex2jar 20150601

@smurfix
Copy link

smurfix commented Aug 24, 2016

Same here. Any idea WRT a fix? or a workaround?

@sigpwned
Copy link

sigpwned commented Feb 13, 2017

I was able to work around this issue with a little elbow grease.

I got the same error as above. I looked at the summary file to find the stack trace:

java.lang.RuntimeException: Method code too large!
        at org.objectweb.asm.MethodWriter.getSize(MethodWriter.java:1872)
        at org.objectweb.asm.AsmBridge.sizeOfMethodWriter(AsmBridge.java:28)
        at com.googlecode.d2j.dex.ExDex2Asm.convertCode(ExDex2Asm.java:55)
        at com.googlecode.d2j.dex.Dex2jar$2.convertCode(Dex2jar.java:128)
        at com.googlecode.d2j.dex.Dex2Asm.convertMethod(Dex2Asm.java:509)
        at com.googlecode.d2j.dex.Dex2Asm.convertClass(Dex2Asm.java:406)
        at com.googlecode.d2j.dex.Dex2Asm.convertDex(Dex2Asm.java:422)
        at com.googlecode.d2j.dex.Dex2jar.doTranslate(Dex2jar.java:172)
        at com.googlecode.d2j.dex.Dex2jar.to(Dex2jar.java:272)
        at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:108)
        at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)
        at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)

Next, I found the jar file which contains that class in the lib directory: asm-debug-all-4.1.jar. Searching for "asm-debug-all-4.1.jar source code" led me here. The relevant snippet of code that's failing is:

if (code.length > 0) {
    if (code.length > 65536) {
        throw new RuntimeException("Method code too large!"); // CULPRIT
    }
    cw.newUTF8("Code");
    size += 18 + code.length + 8 * handlerCount;

What an odd test! It turns out that the java spec states that java method bodies cannot be longer than 64K, so this library is (rightfully) refusing to compile the method dex2jar has generated under the covers. But we're just trying to look at source code, not compile a program, so we don't care about that limit. Let's work around it.

The Right Thing here would be to pull down the build here, update the code, recompile it, and replace the class file. However, I -- frankly -- couldn't be arsed to do all that, so I took the much more direct (irresponsible, and lazy) approach of editing the byte code by hand.

Here's what I did:

  • Download the latest snapshot as of 2017-02-13, dex2jar-2.1-SNAPSHOT and unzip to $D2JHOME
  • Download a java bytecode editor (I used this one and unzipped to $BEHOME)
  • $ cd $D2JHOME
  • Back up the relevant library file $ cp lib/asm-debug-all-4.1.jar lib/asm-debug-all-4.1.jar.orig
  • $ cd lib
  • Extract the MethodWriter class $ unzip asm-debug-all-4.1.jar org/objectweb/asm/MethodWriter.class
  • Launch the bytecode editor and load org/objectweb/asm/MethodWriter.class (In another terminal, I used $ cd $BEHOME/bin; $ java ee.ioc.cs.jbe.browser.BrowserApplication)
  • In the bytecode editor, navigate to the getSize() method
  • In the bytecode editor, change instruction 23 ldc 65536 to a higher value (Note the code editor tab, I used ldc 524288)
  • Save the change in the bytecode editor
  • Update the MethodWriter class $ zip asm-debug-all-4.1.jar org/objectweb/asm/MethodWriter.class
  • Re-run $ $D2JHOME/d2j-dex2jar.sh application.apk -o application.jar --force
  • If that number doesn't work, try a bigger one!

Really, whether to enforce this limit or not should be an option in the asm-debug-all library. In the meantime, I've attached the updated JAR file here. (I had to rename it to ZIP for GitHub to take the file; you'll need to rename it to JAR after you download it.) Back up the existing asm-debug-all-4.1.jar file, and replace the original with the attached (renamed) file. That should work.

@ammaratef45
Copy link

@sigpwned
Your solution is awesome but, I'm stuck with a new exception which is

java.lang.ArrayIndexOutOfBoundsException: 255
at org.objectweb.asm.MethodWriter.getSize(MethodWriter.java)
at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:775)
at com.googlecode.d2j.dex.Dex2jar$1$1.visitEnd(Dex2jar.java:101)
at com.googlecode.d2j.dex.Dex2Asm.convertClass(Dex2Asm.java:409)
at com.googlecode.d2j.dex.Dex2Asm.convertDex(Dex2Asm.java:422)
at com.googlecode.d2j.dex.Dex2jar.doTranslate(Dex2jar.java:172)
at com.googlecode.d2j.dex.Dex2jar.to(Dex2jar.java:272)
at com.googlecode.dex2jar.tools.Dex2jarCmd.doCommandLine(Dex2jarCmd.java:108)
at com.googlecode.dex2jar.tools.BaseCmd.doMain(BaseCmd.java:288)
at com.googlecode.dex2jar.tools.Dex2jarCmd.main(Dex2jarCmd.java:32)

I tried to figure it out but I didn't get the point

@ghost
Copy link

ghost commented Oct 29, 2018

@ammaratef45
Use another bytecode editor.
https://github.com/GraxCode/JByteMod-Beta/releases worked for me.

@ZXTube
Copy link

ZXTube commented Aug 25, 2022

The asm-debug-all-4.1.jar that @sigpwned attached is outdated by now

So you should use this amazing fork which says that it fixed a lot of things and it fixed this unnecessary exception

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

9 participants