小编nav*_*ave的帖子

在未捕获的异常上附加jdb

所以,我正在开始一个Java程序,如下所示

java -agentlib:jdwp=transport=dt_socket,address=8000, server=y,suspend=n  MyClass
Run Code Online (Sandbox Code Playgroud)

然后我手动附加调试器,如下所示

jdb -attach 8000
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方式让我设置jdb,以便它在未捕获的异常情况下自动附加到正在运行的进程(仅)?

原因是我想避免调试器的开销直到出现未捕获的异常.但是我现在面临的问题是,如果没有附加调试器,那么一旦出现未捕获的异常,JVM就会中止.

编辑:

从Oracle 文档来看,似乎下面的命令可以满足我的需求,但对于Windows机器而言.

java -agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe MyClass
Run Code Online (Sandbox Code Playgroud)

谁知道linux等价?我试过下面的命令.

java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,onuncaught=y,suspend=n,launch=jdb MyClass
Run Code Online (Sandbox Code Playgroud)

调试器似乎连接但它会立即抛出IOError.

Initializing jdb ...

java.io.IOException: Input/output error
at java.io.FileInputStream.readBytes(Native Method)
at java.io.FileInputStream.read(FileInputStream.java:272)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:273)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at com.sun.tools.example.debug.tty.TTY.<init>(TTY.java:751)
at com.sun.tools.example.debug.tty.TTY.main(TTY.java:1067)
Run Code Online (Sandbox Code Playgroud)

java debugging jdb

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

在以下位置获取LLVM getelementptr的操作数名称

我正在尝试获取getelementptr指令所引用的数组的名称。当数组被索引为在实际C代码中使用中间变量时,这似乎起作用

int a = 0;
i[a] = 3; 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到以下位码

%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom
store i32 3, i32* %arrayidx, align 4
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以遍历getelementptr指令的操作数,并通过第一个操作数上的getName()方法找到array(i)的名称。

但是,如果在源代码中数组是直接索引的,

i[0] = 3;
Run Code Online (Sandbox Code Playgroud)

然后,生成的位码如下

store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4
Run Code Online (Sandbox Code Playgroud)

在这里,我不确定如何从位代码获取数组名称(i)。存储指令的第二操作数的类型设置为PointerTy。第二个操作数的包含类型为int。两者都符合预期,因为操作数是i32 *。但是,在这种情况下,我不确定如何获取getelementptr指令的句柄以迭代其操作数。

编辑:我应该提到的数组我是一个全局

c arrays llvm

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

春天许多缓存的缺点

由于无法基于部分密钥逐出条目的限制,我正在考虑使用缓存名称作为我的部分密钥并驱逐缓存中的所有(只有一个)条目的解决方法.例如,假设有两个键值对,如下所示:

"123 @ name1" - > value1,"124 @ name2" - > value2

理想情况下,在驱逐时,我想删除包含字符串"123"的所有键.但是,由于不支持,我正在考虑的解决方法是具有以下内容:

"123"缓存:"name1" - > value1

"124"缓存:"name2" - > value2

然后在驱逐时,我只需指定删除"123"缓存中的所有键

当然,这样做的缺点是会有很多不同的缓存.对此有任何性能损失吗?

从阅读本文来看,似乎Redis至少只使用缓存名称作为前缀.因此,它不会在其下创建多个单独的缓存.但我想验证一下我的理解.

如果有帮助,我也希望使用Redis作为我的底层缓存提供程序.

spring caching redis

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

如何构建JNI调用以避免内存泄漏?

所以我在Java中有以下JNIManager类.在这个类中,正如您所看到的,我定义了一个名为setUpBackGround()的本机方法;

public class JNIManager{
   public native void setUpBackground();
   public void messageMe(byte[] byteArray);
}
Run Code Online (Sandbox Code Playgroud)

然后我有另一个用本机(C)代码实现的类.我们称这个类为Background Class.这个类做了一些后台工作,并调用JNIManager类的messageMe()方法传递一个byte [].

class Background{
   JNIEnv* mJNIEnv;
   jbyteArray mArray;
   jobject mJObject;    

   Background(JNIEnv * env, jobject jObject){
      mArray = env->NewByteArray(1040);
      mJNIEnv = env;
      mJObject = jObject;
   }

   virtual ~Background(){
      mJNIEnv->DeleteLocalRef(mArray); //is this necessary?
   }

   void someMethod(){
      jclass manager = mJNIEnv->GetObjectClass(mJObject);
      jmethodID method = mJNIEnv->GetMethodID(manager, "messageMe", "([B)V");                         
      mJNIEnv->CallVoidMethod(mJObject, method, mArray);
      mJNIEnv->DeleteLocalRef(manager); // is this necessary?
   }

}
Run Code Online (Sandbox Code Playgroud)

现在,在本机方法setUpBackground中,我执行以下操作,

JNIEXPORT jlong JNICALL Java_com_example_test_JNIManager_setUpBackground
  (JNIEnv * env, jobject jo){
    Background* back …
Run Code Online (Sandbox Code Playgroud)

c c++ java java-native-interface memory-leaks

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

标签 统计

c ×2

java ×2

arrays ×1

c++ ×1

caching ×1

debugging ×1

java-native-interface ×1

jdb ×1

llvm ×1

memory-leaks ×1

redis ×1

spring ×1