Thursday, November 30, 2017

Print a given line of a text file in bash

1. fos@ubuntu:~/dev/java$ head -n 4 HelloWorld.java  |tail -1
public class HelloWorld {

2. fos@ubuntu:~/dev/java$ sed -n '4p' HelloWorld.java
public class HelloWorld {

fos@ubuntu:~/dev/java$ sed  '4!d' HelloWorld.java
public class HelloWorld {

fos@ubuntu:~/dev/java$ sed '4q;d' HelloWorld.java    # efficient on large files
public class HelloWorld {

3. fos@ubuntu:~/dev/java$ ex +4p -scq HelloWorld.java
public class HelloWorld {

4. fos@ubuntu:~/dev/java$ awk 'FNR==4 {print $0}' HelloWorld.java
public class HelloWorld {

5. .....

Java version in the .class file

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/eclipse/jetty/util/security/Password : Unsupported major.minor version 52.0

java.lang.UnsupportedClassVersionError happens because of a higher JDK during compile time and lower JDK during runtime.


1. fos@ubuntu:~/dev/java$ javap -v HelloWorld |grep version
  minor version: 0
  major version: 52
2. fos@ubuntu:~/dev/java$ file HelloWorld.class
HelloWorld.class: compiled Java class data, version 52.0 (Java 1.8)

3. Find the value in 6th and 7th bytes:
Within Emacs:
87654321  0011 2233 4455 6677 8899 aabb ccdd eeff  0123456789abcdef
00000000: cafe babe 0000 0034 0041 0a00 1000 1d07  .......4.A......

Or Use hexdump:
fos@ubuntu:~/dev/java$ hexdump HelloWorld.class |more
0000000 feca beba 0000 3400 4100 000a 0010 071d

0x34 = 52  <--- 8="" is="" java="" p="" this="">


Here's the list of versions:

Java SE 9 = 53,
Java SE 8 = 52,
Java SE 7 = 51,
Java SE 6.0 = 50,
Java SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

More:
The class file format: https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html

Tuesday, November 7, 2017

GDB cheatsheet

 gdb -args ./binary arg1 arg2 ...

set print pretty on
p *var1
p *var1@len

gdb -tui. tui stands for Text User Interface
C-x a to show/hide source code and assembly code window
C-x 1 to show only source code window
C-x 2 to show only assembly code window