小编Ade*_*del的帖子

ASM中的Java方法参数值

我试图获取Java程序的方法参数的值.我正在使用ASM来检测字节码并获取这些值.但是,我遇到了一些麻烦.

这是用于检测代码的visitCode()方法.它正在做的是:

  1. 创建一个空数组以存储收集的参数.
  2. 对于每个参数,将其值加载到数组中.
  3. 将此数组发送到我的代理的OnMethodEntry方法(将使用其值).

.

@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)

java jvm bytecode bytecode-manipulation java-bytecode-asm

9
推荐指数
1
解决办法
5040
查看次数

Cmake和clang工具链接错误(源树之外)

我正在尝试使用CMake文件编译ClangRecursiveASTVisitor示例.构建项目进展顺利,但是链接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)

c++ cmake llvm clang llvm-clang

9
推荐指数
1
解决办法
7200
查看次数

与ASM字节码检测功能不兼容的参数

我在使用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

5
推荐指数
1
解决办法
658
查看次数

检查非空后检测到空指针异常

我对一个不应该为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 nullpointerexception javaagents java-bytecode-asm

1
推荐指数
1
解决办法
2978
查看次数