小编Aks*_*nik的帖子

C++跳转到其他方法执行

在我的C++ JNI-Agent项目中,我正在实现一个函数,该函数将被赋予可变数量的参数并将执行传递给另一个函数:

// address of theOriginalFunction
public static void* originalfunc;

void* interceptor(JNIEnv *env, jclass clazz, ...){

    // add 4 to the function address to skip "push ebp / mov ebp esp"
    asm volatile("jmp *%0;"::"r" (originalfunc+4));

    // will not get here anyway
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

上面的函数只需要跳转到:

JNIEXPORT void JNICALL Java_main_Main_theOriginalFunction(JNIEnv *env, jclass clazz, jboolean p1, jbyte p2, jshort p3, jint p4, jlong p5, jfloat p6, jdouble p7, jintArray p8, jbyteArray p9){
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常,原始函数可以正确读取所有参数(使用包括数组在内的9种不同类型的参数进行测试).

但是,在从拦截器跳入原始函数之前,我需要做一些计算.但是,在这里我观察到有趣的行为.

void* interceptor(JNIEnv *env, jclass …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface stack javaagents

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

使用eclipse调试OpenJDK源代码

在我的项目中,我想使用eclipse调试OpenJDK版本8的C/C++源代码.为此,我做了以下事情:

  1. --with-debug-level=slowdebug使用此自述文件编译OpenJDK8 .
  2. 将源码makefile项目导入eclipse
  3. 创建了一个eclipse运行配置,对已编译的OpenJDK的java.exe执行gdb并定位示例java程序.在这个配置中我附加了JDK源代码目录路径,这样eclipse就可以将调试符号转换为源代码行并查看它们(显然)

通过这种方法,我可以通过像这样的文件代码进行调试java.c.

我的问题是,我仍然无法通过本机代码进行调试.比如说java.lang.System.currentTimeMillis().

对我来说,看起来这些库没有包含在eclipse gdb-run中.我试图手动运行gdb,它仍然无法通过该代码部分进行调试.

有没有人有同样的行为,或曾经尝试调试JDK源代码?我想我在这里遗漏了一些东西......也许我的方法对于任务来说是不正确的?很高兴听到有关如何正确调试JDK源代码的任何提议.

先感谢您.

java eclipse debugging java-native-interface gdb

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

有状态的 Rsocket 应用程序

在我的项目中,我想让多个客户端连接到一个服务。我正在使用 java Rsocket 实现。

服务应该为每个客户端维护一个状态。现在,我可以通过一些标识符来管理客户端。这个选项我已经实现了。但我不想使用字符串手动管理会话。

所以另一个想法是通过 Rsocket 连接来识别客户端。有没有办法使用 Rsocket 通道来识别特定客户端?

想象一个示例服务和几个客户端。每个客户端都有 Rsocket 通道,服务启动并运行。有没有办法使用 Rsocket 通道在服务器端识别这些客户端?如果您能展示此类行为的程序化示例,那就太棒了。谢谢!

编辑(更详细地描述案例)

这是我的例子。

我们目前使用了三个 CORBA 对象,如图所示:

  • LoginObject(通过 NamingService 检索到的引用)。客户端可以调用 login() 方法来获取会话
  • Session 对象有各种方法来查询有关当前服务上下文的详细信息,最重要的是获取 Transaction 对象
  • Transaction 对象可用于通过通用方法执行各种命令,该方法将 commandName 和键值对列表作为参数。在客户端执行 n 个命令后,他可以提交或回滚事务(也可以通过 Transaction 对象上的方法)。

在此处输入图片说明

所以在这里我们使用会话对象在我们的服务上执行事务。

现在我们决定从 CORBA 转移到 Rsocket。因此我们需要 Rsocket 微服务能够存储会话的状态,否则我们无法知道将要提交或回滚什么。这可以通过每个客户端的单独发布者完成吗?

java reactive-programming rsocket

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

C++设置堆栈指针

在我的C++/C项目中,我想将堆栈指针设置为等于基指针 ...直观地,我会使用这样的东西:

asm volatile(
    "movl %%ebp %%esp"
);
Run Code Online (Sandbox Code Playgroud)

但是,当我执行此操作时,我收到此错误消息:

Error: bad register name `%%ebp %%esp'
Run Code Online (Sandbox Code Playgroud)

我使用gcc/g ++版本4.9.1编译器.

我不知道我是否需要设置特定的g ++或gcc标志...应该有一种方法来操作espebp寄存器,但我只是不知道正确的方法来做到这一点.

有谁知道如何在c ++中操纵这两个寄存器?也许我应该使用hexed OP代码?

c++ x86 assembly

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