我试图获取Java程序的方法参数的值.我正在使用ASM来检测字节码并获取这些值.但是,我遇到了一些麻烦.
这是用于检测代码的visitCode()方法.它正在做的是:
.
@Override
public void visitCode() {
int paramLength = paramTypes.length;
// Create array with length equal to number of parameters
mv.visitIntInsn(Opcodes.BIPUSH, paramLength);
mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
mv.visitVarInsn(Opcodes.ASTORE, paramLength);
// Fill the created array with method parameters
int i = 0;
for (Type tp : paramTypes) {
mv.visitVarInsn(Opcodes.ALOAD, paramLength);
mv.visitIntInsn(Opcodes.BIPUSH, i);
if (tp.equals(Type.BOOLEAN_TYPE) || tp.equals(Type.BYTE_TYPE) || tp.equals(Type.CHAR_TYPE) || tp.equals(Type.SHORT_TYPE) || tp.equals(Type.INT_TYPE))
mv.visitVarInsn(Opcodes.ILOAD, i);
else if (tp.equals(Type.LONG_TYPE)) {
mv.visitVarInsn(Opcodes.LLOAD, i);
i++;
}
else if (tp.equals(Type.FLOAT_TYPE))
mv.visitVarInsn(Opcodes.FLOAD, i);
else if …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CMake文件编译Clang的RecursiveASTVisitor示例.构建项目进展顺利,但是链接C++可执行文件失败了多个未定义的LLVM和Clang库引用.我正在构建LLVM/Clang源文件树之外的示例.
这是我的CMakeLists.txt(我正在使用此项目中的FindClang.cmake和FindLLVM.cmake):
cmake_minimum_required(VERSION 2.8.4)
project(ifcount)
set(CMAKE_MODULE_PATH
${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules
${CMAKE_MODULE_PATH})
message(STATUS "CMAKE module path: ${CMAKE_MODULE_PATH}")
find_path(LibClang_INCLUDE_DIR clang-c/Index.h)
find_library(LIBCLANG_LIBRARY NAMES clang)
find_package(LLVM REQUIRED)
find_package(LLVM REQUIRED CONFIG)
Find_Package(LLVM REQUIRED)
include_directories(${LLVM_INCLUDE_DIR})
link_directories(${LLVM_LIB_DIR})
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
find_package(Clang REQUIRED)
find_package(Clang REQUIRED clangTooling libClang)
include_directories(${CLANG_INCLUDE_DIRS})
###
add_definitions(${LLVM_DEFINITIONS})
add_definitions(${Clang_DEFINITIONS})
add_definitions("-std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LLVM_COMPILE_FLAGS} -Wall -fno-rtti -g -std=c++11 -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS")
set(SOURCE_FILES main.cpp)
add_executable(ifcount ${SOURCE_FILES})
llvm_map_components_to_libnames(llvm_libs support core irreader)
target_link_libraries(ifcount ${llvm_libs} ${LLVM_LDFLAGS} ${CLANG_LIBS})
Run Code Online (Sandbox Code Playgroud)
这是输出:
-- The C compiler identification …Run Code Online (Sandbox Code Playgroud) 我在使用Guava库运行一个简单的主程序时遇到了一些麻烦.
我已经使用我的代码从类中检测了类以获取方法参数:ASM中的Java方法参数值
问题是,虽然代码适用于小型项目(也就是河内之塔),但是使用Guava我有错误和例外.
特别是,在测试Joiner.join方法时,我有这个错误:
Exception in thread "Jalen Agent" java.lang.VerifyError: (class: com/google/common/base/Joiner, method: withKeyValueSeparator signature: (Ljava/lang/String;)Lcom/google/common/base/Joiner$MapJoiner;) Incompatible argument to function
at Main.joinBench(Main.java:42)
at Main.main(Main.java:20)
Run Code Online (Sandbox Code Playgroud)
当使用-noverify运行示例时,我有一个例外:
Exception in thread "Jalen Agent" java.lang.ArrayIndexOutOfBoundsException: 1
at com.google.common.base.Joiner.<init>(Joiner.java)
at com.google.common.base.Joiner.on(Joiner.java:71)
at Main.joinBench(Main.java:42)
at Main.main(Main.java:20)
Run Code Online (Sandbox Code Playgroud)
该方法的字节码是一致的:
public static com.google.common.base.Joiner on(java.lang.String);
Code:
0: bipush 1
2: anewarray #4 // class java/lang/Object
5: astore_1
6: aload_1
7: bipush 0
9: aload_0
10: aastore
11: ldc #20 // int 369
13: ldc #21 // String com/google/common/base/Joiner
15: …Run Code Online (Sandbox Code Playgroud) java bytecode bytecode-manipulation verifyerror java-bytecode-asm
我对一个不应该为null的变量有一个奇怪的java.lang.NullPointerException.
Object[] params = new Object[10];
if (param1 != null)
params[0] = param1;
Run Code Online (Sandbox Code Playgroud)
param1作为方法参数给出,它可以为null.通常,当影响param1到params [0]时,它不为null(否则它不会传递if语句).
这是错误(第144行是"params [0] = param1;"):
Exception in thread "Jalen Agent" java.lang.NullPointerException
at jalen.MethodStats.onMethodEntry(MethodStats.java:144)
at hanoi.TowersOfHanoi.solveHanoi(TowersOfHanoi.java)
at hanoi.TowersOfHanoi.main(TowersOfHanoi.java:29)
Run Code Online (Sandbox Code Playgroud)
以下是发生异常的方法的完整代码:
public static void onMethodEntry(int id, String className, String methodName, Object param1, Object param2, Object param3, Object param4, Object param5) {
synchronized (globalLock) {
Object[] params = new Object[10];
if (param1 != null)
params[0] = param1;
if (param2 != null)
params[1] = param2;
if (param3 != null)
params[2] = …Run Code Online (Sandbox Code Playgroud) java ×3
bytecode ×2
c++ ×1
clang ×1
cmake ×1
javaagents ×1
jvm ×1
llvm ×1
llvm-clang ×1
verifyerror ×1