V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jeffh
V2EX  ›  程序员

Java 调用链跟踪源码求助

  •  
  •   jeffh · 2020-04-21 17:49:18 +08:00 · 2686 次点击
    这是一个创建于 1706 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目使用的是 Hibernate,我想看看当我执行 SQL 时 Hibernate 具体执行了它自身的哪些代码,我想跟踪源码看看,是否有工具可以看到它执行过程的调用栈呢?感谢。
    20 条回复    2020-04-22 12:56:54 +08:00
    monkeyWie
        1
    monkeyWie  
       2020-04-21 17:52:32 +08:00
    打个断点不就看到了吗
    jeffh
        2
    jeffh  
    OP
       2020-04-21 18:03:25 +08:00
    @monkeyWie 不知道在 Hibernate 源码中的哪个地方打断点
    royan
        3
    royan  
       2020-04-21 18:03:41 +08:00
    祝早日脱离 hibernate 的苦海
    340244120w
        4
    340244120w  
       2020-04-21 18:15:52 +08:00
    @jeffh #2
    在你业务查询代码里打个断点,到断点的时候,仔细看 idea 的 debug 窗口里所有 tab 。。。
    jeffh
        5
    jeffh  
    OP
       2020-04-21 18:16:50 +08:00
    @340244120w 这个时候调用栈还没到 hibernate 里面
    guyeu
        6
    guyeu  
       2020-04-21 18:32:18 +08:00
    @jeffh #5 然后一行一行跟,它总能走进去的
    340244120w
        7
    340244120w  
       2020-04-21 18:34:35 +08:00
    用 xrebel 吧
    jeffh
        8
    jeffh  
    OP
       2020-04-21 18:45:43 +08:00
    @guyeu 我试过,按住 F7 不放,半天了都没进去,所以才来求助,(哭
    zhaorunze
        9
    zhaorunze  
       2020-04-21 19:10:14 +08:00
    先抛异常,然后在异常所在文件的函数上面打断点。当然如果没有异常当我没说,或者可以认为的制造异常,然后抛异常的位置,大概就是关键代码位置。
    ic2y
        10
    ic2y  
       2020-04-21 19:19:06 +08:00
    @jeffh 直接在 jdbc 的 jar 包打断点,让线程停住,然后回头看调用栈。看看上下文是怎么做 ORM 处理的。
    ic2y
        11
    ic2y  
       2020-04-21 19:22:40 +08:00
    例如,com.mysql.jdbc.StatementImpl 的 executeQuery 方法,这种底层 jdbc 的 查询和 execute 方法,打上断点,然后做一些业务操作,静静等待断点到来
    aitaii
        12
    aitaii  
       2020-04-21 20:11:48 +08:00 via Android
    断电看调用栈
    aitaii
        13
    aitaii  
       2020-04-21 20:12:03 +08:00 via Android
    @aitaii 断点
    jeffh
        14
    jeffh  
    OP
       2020-04-21 21:33:57 +08:00
    @340244120w 貌似不是我想要的
    ilumer
        15
    ilumer  
       2020-04-22 00:29:28 +08:00
    故意抛出异常,然后跟着堆栈走
    scemsjyd
        16
    scemsjyd  
       2020-04-22 08:12:30 +08:00 via Android
    arthas 可以看调用栈,不过没有直接本地 debug 来的快
    THESDZ
        17
    THESDZ  
       2020-04-22 09:03:58 +08:00
    是不是看似没进去,实际使用了反射,然后你跳过了?
    oneisall8955
        18
    oneisall8955  
       2020-04-22 09:09:58 +08:00 via Android
    呆呆的办法~

    ```java
    public void test(){
    A a = aDao.save(new A());
    // 断点下一行
    sout("断点这一行然后看调用栈找到你需要的断点入口再断点");
    }
    ```
    340244120w
        19
    340244120w  
       2020-04-22 10:48:13 +08:00
    @jeffh #14 xrebel 能看到 sql 语句到 controller 的所有栈信息,不就是你要的么。。你用了就知道了
    zek
        20
    zek  
       2020-04-22 12:56:54 +08:00
    试试 java Agent
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   852 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:34 · PVG 04:34 · LAX 12:34 · JFK 15:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.