dlib怎么由debug转换成release_用 Java 代码,debug 下 JVM 结果亮了!

4c1be6fe180192fb322cd7272bb56a4f.png

9660c211091b45431f307fdaa27749fb.png

# 搭建调试环境

## 1.下载 CLion 软件

Jetbrains 是一家非常牛逼的公司,咱 Java 里面用到的 IDEA 功能很强大,这公司也为 C/C++ 提供一个 IDE,名叫 CLion,咱需要下载这个 IDE 来调试 JVM 源码。

# 2.导入源码

安装完 CLion 之后,咱就可以先导入代码,下面简单记录一下操作步骤。

选择 New CMake Project from Sources

7481a62fbc1f12aad0ce04f69aa8e8f5.png

打开我们下载 OpenJDK13 的目录,我的目录是 /opt/java/openjdk/jdk13。

cbf43ab062be6d128366e04eb553ecc3.png

接下来有弹框点击 Next 就行了,等待导入源码完成(需要几分钟,可以喝杯茶)。

# 3.启动配置

导完源码后,我们需要配置启动程序,这里有些配置需要重新指定,主要有下面 2 点。

  • Executable 修改为咱们编译后的 java 程序。

71d13f6a3560d09193ba4e2a024e520a.png
  • Build 需要删除掉。

c90c839ade4c477e560f002667d2710e.png

# 4.打下断点

我们在 thread.cpp 代码的 Threads::create_vm 方法打下断点。

e0a2cc063746cb913d8df665e1f679c4.png

# 5.开始 Debug

点击 Debug 按钮,开始调试我们的 JVM 代码。可以看到我们打的断点生效了,如下图所示。

d39b1ecbef3a265b80a758a22698aebb.png

恭喜,我们成功调试 JVM 代码。不过发现了下面这个异常信息,解决它。

# 6.发现这个异常

按 F9 让程序继续跑,我们发现 Console 出现了下面红框的一行字。

196814b7ef1f3722766790ad058da123.png

这是 GDB 的异常信息,我们可以通过在我们的用户目录下添加配置来解决这个问题。创建 ~/.gdbinit 文件,添加如下配置。

handle SIGSEGV nostop noprint pass
handle SIGBUS nostop noprint pass
handle SIGFPE nostop noprint pass
handle SIGPIPE nostop noprint pass
handle SIGILL nostop noprint pass
复制代码

再运行就不会有这个异常信息了。

# 调试自己的代码

上面已经调通了我们编译的 JVM 源码,有同学可能想知道,那要调试自己写的代码得怎么操作呢?我们上面已经看到 Debug 到 JVM 源码了,我们自己的代码则可以通过我们编译后的 JDK 来编译,然后在程序执行参数那里指定。下面举个例子。

# 1.编写 Test 代码

我们编写一个简单的 Hello JVM 程序,代码如下。

public class Test {

    public static void main(String[] args) {
        System.out.println("hello jvm");
    }
}

# 2.javac 编译

通过我们编译后的 JDK 命令 javac Test.java 来编译。

liebrother@liebrother:/opt/java/openjdk/jdk13/build/linux-x86_64-server-release/jdk/bin$ ./javac Test.java

# 3.配置启动参数

然后在 Clion 程序启动配置那里指定我们的类 Test。

2595a9de5ff01f11110ca38a5fdecfa6.png

结果就是我们的程序被运行了。

b2853300b432c4b6f42f461b127846a5.png

以上就是我们今天要讲的在 JVM 层面上调试我们自己写的程序。

# 总结

总结一下搭建这套 JVM 环境。搭建过程中其实没有很波折,官方文档写的很清晰(虽然都是英文的),把一些步骤简化,也截图保留下来,一方面给自己回顾的机会,一方面也是给有想要搭建这套环境的朋友们一个捷径。这套环境接下来的定义是:给自己深入了解 JVM 的机会,在遇到某些知识点不清晰,不明白原理的时候,就可以看一看源码,揪出源头的逻辑


最后:

3c4ac092b43103e7f44f59a0ce9c42b2.png

上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注。

学习我们是认真的,拿大厂offer是势在必得的。java(想了解更多点一下哦)

原文链接:https://juejin.im/post/5e493696e51d45270d53060d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用dlib进行人脸识别可以使用dlib_face_recognition_resnet_model_v1模型,以下是一个简单的示例代码: ```c++ #include <iostream> #include <dlib/opencv.h> #include <dlib/image_processing/frontal_face_detector.h> #include <dlib/image_processing.h> #include <dlib/gui_widgets.h> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace dlib; using namespace std; int main() { // 初始化人脸检测器和人脸特征提取器 frontal_face_detector detector = get_frontal_face_detector(); shape_predictor sp; deserialize("shape_predictor_68_face_landmarks.dat") >> sp; // 加载人脸识别模型 anet_type net; deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net; // 加载待识别的图像 cv::Mat img = cv::imread("test.jpg"); // 将图像转换为dlib的图像格式 cv_image<bgr_pixel> cimg(img); // 人脸检测 std::vector<rectangle> faces = detector(cimg); // 人脸特征提取 std::vector<matrix<float,0,1>> face_descriptors; for (unsigned long i = 0; i < faces.size(); ++i) { full_object_detection shape = sp(cimg, faces[i]); matrix<rgb_pixel> face_chip; extract_image_chip(cimg, get_face_chip_details(shape,150,0.25), face_chip); face_descriptors.push_back(net(face_chip)); } // 输出人脸特征 for (unsigned long i = 0; i < face_descriptors.size(); ++i) cout << "face descriptor " << i << ": " << trans(face_descriptors[i]) << endl; return 0; } ``` 其中,需要下载预训练模型文件`shape_predictor_68_face_landmarks.dat`和`dlib_face_recognition_resnet_model_v1.dat`,并放置在代码所在目录下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值