Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_39073359
jadx
提交
8f201f1f
J
jadx
项目概览
qq_39073359
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8f201f1f
编写于
9月 13, 2014
作者:
S
skylot
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #19 from NeoSpb/fix3
core: fix processing of debug info (markup of local variables)
上级
010ae99c
d1e0762c
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
102 addition
and
7 deletion
+102
-7
jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java
...src/main/java/jadx/core/dex/instructions/args/SSAVar.java
+54
-0
jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
+7
-0
jadx-core/src/main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java
...main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java
+26
-4
jadx-core/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java
...re/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java
+14
-3
jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java
...rc/main/java/jadx/core/dex/visitors/ssa/SSATransform.java
+1
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/instructions/args/SSAVar.java
浏览文件 @
8f201f1f
...
...
@@ -11,6 +11,9 @@ public class SSAVar {
private
final
int
version
;
private
VarName
varName
;
private
int
startUseAddr
;
private
int
endUseAddr
;
private
RegisterArg
assign
;
private
final
List
<
RegisterArg
>
useList
=
new
ArrayList
<
RegisterArg
>(
2
);
private
PhiInsn
usedInPhi
;
...
...
@@ -25,12 +28,63 @@ public class SSAVar {
if
(
assign
!=
null
)
{
assign
.
setSVar
(
this
);
}
startUseAddr
=
-
1
;
endUseAddr
=
-
1
;
}
public
int
getRegNum
()
{
return
regNum
;
}
public
int
getStartAddr
()
{
if
(
startUseAddr
==
-
1
)
{
calcUsageAddrRange
();
}
return
startUseAddr
;
}
public
int
getEndAddr
()
{
if
(
endUseAddr
==
-
1
)
{
calcUsageAddrRange
();
}
return
endUseAddr
;
}
private
void
calcUsageAddrRange
()
{
int
start
=
Integer
.
MAX_VALUE
;
int
end
=
Integer
.
MIN_VALUE
;
if
(
assign
!=
null
)
{
if
(
assign
.
getParentInsn
()
!=
null
)
{
int
insnAddr
=
assign
.
getParentInsn
().
getOffset
();
if
(
insnAddr
>=
0
)
{
start
=
Math
.
min
(
insnAddr
,
start
);
end
=
Math
.
max
(
insnAddr
,
end
);
}
}
}
for
(
RegisterArg
arg
:
useList
)
{
if
(
arg
.
getParentInsn
()
!=
null
)
{
int
insnAddr
=
arg
.
getParentInsn
().
getOffset
();
if
(
insnAddr
>=
0
)
{
start
=
Math
.
min
(
insnAddr
,
start
);
end
=
Math
.
max
(
insnAddr
,
end
);
}
}
}
if
((
start
!=
Integer
.
MAX_VALUE
)
&&
(
end
!=
Integer
.
MIN_VALUE
))
{
startUseAddr
=
start
;
endUseAddr
=
end
;
}
}
public
int
getVersion
()
{
return
version
;
}
...
...
jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
浏览文件 @
8f201f1f
...
...
@@ -52,6 +52,7 @@ public class MethodNode extends LineAttrNode implements ILoadable {
private
final
Method
methodData
;
private
int
regsCount
;
private
InsnNode
[]
instructions
;
private
int
codeSize
;
private
int
debugInfoOffset
;
private
boolean
noCode
;
...
...
@@ -82,6 +83,7 @@ public class MethodNode extends LineAttrNode implements ILoadable {
try
{
if
(
noCode
)
{
regsCount
=
0
;
codeSize
=
0
;
initMethodTypes
();
return
;
}
...
...
@@ -94,6 +96,7 @@ public class MethodNode extends LineAttrNode implements ILoadable {
InsnDecoder
decoder
=
new
InsnDecoder
(
this
);
decoder
.
decodeInsns
(
mthCode
);
instructions
=
decoder
.
process
();
codeSize
=
instructions
.
length
;
initTryCatches
(
mthCode
);
initJumps
();
...
...
@@ -350,6 +353,10 @@ public class MethodNode extends LineAttrNode implements ILoadable {
return
noCode
;
}
public
int
getCodeSize
()
{
return
codeSize
;
}
public
InsnNode
[]
getInstructions
()
{
return
instructions
;
}
...
...
jadx-core/src/main/java/jadx/core/dex/nodes/parser/DebugInfoParser.java
浏览文件 @
8f201f1f
...
...
@@ -3,6 +3,7 @@ package jadx.core.dex.nodes.parser;
import
jadx.core.dex.attributes.nodes.SourceFileAttr
;
import
jadx.core.dex.instructions.args.InsnArg
;
import
jadx.core.dex.instructions.args.RegisterArg
;
import
jadx.core.dex.instructions.args.SSAVar
;
import
jadx.core.dex.nodes.DexNode
;
import
jadx.core.dex.nodes.InsnNode
;
import
jadx.core.dex.nodes.MethodNode
;
...
...
@@ -112,8 +113,9 @@ public class DebugInfoParser {
int
regNum
=
section
.
readUleb128
();
LocalVar
var
=
locals
[
regNum
];
if
(
var
!=
null
)
{
var
.
end
(
addr
,
line
);
setVar
(
var
);
if
(
var
.
end
(
addr
,
line
))
{
setVar
(
var
);
}
var
.
start
(
addr
,
line
);
}
break
;
...
...
@@ -160,7 +162,7 @@ public class DebugInfoParser {
for
(
LocalVar
var
:
locals
)
{
if
(
var
!=
null
&&
!
var
.
isEnd
())
{
var
.
end
(
addr
,
line
);
var
.
end
(
mth
.
getCodeSize
()-
1
,
line
);
setVar
(
var
);
}
}
...
...
@@ -236,7 +238,27 @@ public class DebugInfoParser {
if
(
arg
!=
null
&&
arg
.
isRegister
())
{
RegisterArg
reg
=
(
RegisterArg
)
arg
;
if
(
var
.
getRegNum
()
==
reg
.
getRegNum
())
{
reg
.
mergeDebugInfo
(
var
.
getType
(),
var
.
getName
());
SSAVar
ssaVar
=
reg
.
getSVar
();
boolean
mergeRequired
=
false
;
if
(
ssaVar
!=
null
)
{
int
ssaEnd
=
ssaVar
.
getEndAddr
();
int
ssaStart
=
ssaVar
.
getStartAddr
();
int
localStart
=
var
.
getStartAddr
();
int
localEnd
=
var
.
getEndAddr
();
boolean
isIntersected
=
!((
localEnd
<
ssaStart
)
||
(
ssaEnd
<
localStart
));
if
(
isIntersected
&&
(
ssaEnd
<=
localEnd
))
{
mergeRequired
=
true
;
}
}
else
{
mergeRequired
=
true
;
}
if
(
mergeRequired
)
{
reg
.
mergeDebugInfo
(
var
.
getType
(),
var
.
getName
());
}
}
}
}
...
...
jadx-core/src/main/java/jadx/core/dex/nodes/parser/LocalVar.java
浏览文件 @
8f201f1f
...
...
@@ -69,9 +69,20 @@ final class LocalVar {
this
.
startAddr
=
addr
;
}
public
void
end
(
int
addr
,
int
line
)
{
this
.
isEnd
=
true
;
this
.
endAddr
=
addr
;
/**
* Sets end address of local variable
* @param addr address
* @param line source line
* @return <b>true</b> if local variable was active, else <b>false</b>
*/
public
boolean
end
(
int
addr
,
int
line
)
{
if
(!
isEnd
)
{
this
.
isEnd
=
true
;
this
.
endAddr
=
addr
;
return
true
;
}
return
false
;
}
public
int
getRegNum
()
{
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/ssa/SSATransform.java
浏览文件 @
8f201f1f
...
...
@@ -80,6 +80,7 @@ public class SSATransform extends AbstractVisitor {
}
PhiInsn
phiInsn
=
new
PhiInsn
(
regNum
,
block
.
getPredecessors
().
size
());
phiList
.
getList
().
add
(
phiInsn
);
phiInsn
.
setOffset
(
block
.
getStartOffset
());
block
.
getInstructions
().
add
(
0
,
phiInsn
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录