成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java開源工具在linux上的源碼分析(五):-F參數的bug

開發 后端
當使用jmap,jstack是用-F參數的時候,是通過調用系統調用ptrace來取的寄存器的信息,在jdk6u23版本之前你會發現,當你使用jstack -F的時候 經常在logger 里面 看到錯誤信息,直接拋出異常,根本無法看到堆棧信息。

當使用jmap,jstack是用-F參數的時候,是通過調用系統調用ptrace來取的寄存器的信息,關于linux下的ptrace實現可以參考我的博客(http://blog.csdn.net/raintungli/article/details/6563867)

在jdk6u23版本之前你會發現,當你使用jstack -F的時候 經常在logger 里面 看到錯誤信息,直接拋出異常,根本無法看到堆棧信息。

  1. Thread 26724: (state = BLOCKED)  
  2. Error occurred during stack walking:  
  3. sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp  
  4.         at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:152)  
  5.         at sun.jvm.hotspot.debugger..... 

通過查看源碼,最后調用的函數是process_get_lwp_regs /ps_proc.c

  1. static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct user_regs_struct *user) {  
  2.   // we have already attached to all thread 'pid's, just use ptrace call  
  3.   // to get regset now. Note that we don't cache regset upfront for processes.  
  4. // Linux on x86 and sparc are different.  On x86 ptrace(PTRACE_GETREGS, ...)  
  5. // uses pointer from 4th argument and ignores 3rd argument.  On sparc it uses  
  6. // pointer from 3rd argument and ignores 4th argument  
  7. #if defined(sparc) || defined(sparcv9)  
  8. #define ptrace_getregs(request, pid, addr, data) ptrace(request, pid, addr, data)  
  9. #else 
  10. #define ptrace_getregs(request, pid, addr, data) ptrace(request, pid, data, addr)  
  11. #endif  
  12.  
  13. #ifdef _LP64  
  14. #ifdef PTRACE_GETREGS64  
  15. #define PTRACE_GETREGS_REQ PTRACE_GETREGS64  
  16. #endif  
  17. #else 
  18. #if defined(PTRACE_GETREGS) || defined(PT_GETREGS)  
  19. #define PTRACE_GETREGS_REQ PTRACE_GETREGS  
  20. #endif  
  21. #endif /* _LP64 */ 
  22.  
  23. #ifdef PTRACE_GETREGS_REQ  
  24.  if (ptrace_getregs(PTRACE_GETREGS_REQ, pid, user, NULL) < 0) {  
  25.    print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);  
  26.    return false;  
  27.  }  
  28.  return true;  
  29. #else 
  30.  print_debug("ptrace(PTRACE_GETREGS, ...) not supported\n");  
  31.  return false;  
  32. #endif  
  33.  

無法判斷究竟是否是因為沒有定義參數PTRACE_GETREGS_REQ,還是因為ptrace的調用參數錯誤所導致的,這樣就必須打開print_debug,查看打印的信息。

通過源碼,可以查到print_debug函數是通過環境變量LIBSAPROC_DEBUG來控制

設置

export LIBSAPROC_DEBUG=1

運行

jstack -F processid

我們能看到錯誤中多了一行

  1. Thread 26724: (state = BLOCKED)  
  2. libsaproc DEBUG: ptrace(PTRACE_GETREGS, ...) not supported 

產生的原因就非常清楚了,bug主要是因為宏定義PTRACE_GETREGS_REQ缺失,查看源碼

  1. #ifdef _LP64  
  2. #ifdef PTRACE_GETREGS64  
  3. #define PTRACE_GETREGS_REQ PTRACE_GETREGS64  
  4. #endif  
  5. #else 
  6. #if defined(PTRACE_GETREGS) || defined(PT_GETREGS)  
  7. #define PTRACE_GETREGS_REQ PTRACE_GETREGS  
  8. #endif  
  9. #endif /* _LP64 */ 

_LP64 是64位機器的宏定義,而對ptrace的參數PTRACE_GETREGS64,顯然Linux kernel 2.6.35里面并沒有支持,導致了沒有宏定義PTRACE_GETREGS_REQ,這里明顯是jvm沒有考慮到的情況。

解決辦法

a. 因為這是jvm 編譯級別的bug,除非你重現修改編譯libsaproc.so,覆蓋目錄/jdk1.6.0_23/jre/lib/amd64

筆者自己編譯了這個lib,可以在csdn上下載(http://download.csdn.net/detail/raintungli/4065304),筆者編譯的jdk版本是1.6.23 build(19.0)

b. 建議升級jvm到1.6.30版本,該版本已經測試過,已經修復該bug.

后話:

  1. if (ptrace_getregs(PTRACE_GETREGS_REQ, pid, user, NULL) < 0) {  
  2.   print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);  
  3.   return false;  

jvm可以在此處更清楚點,不是簡單的判斷<0,而是在判斷<0的時候把errno打印出來,能更容易的判斷出是什么原因無法ptrace 上。

原文鏈接:http://blog.csdn.net/raintungli/article/details/7245709

【系列文章】

  1. Java開源工具在linux上的源碼分析(一):跟蹤方式
  2. Java開源工具在linux上的源碼分析(二):信號處理
  3. Java開源工具在linux上的源碼分析(三):執行的線程vm thread
  4. Java開源工具在linux上的源碼分析(四):safe point
  5. Java開源工具在linux上的源碼分析(六):符號表的讀取
責任編輯:林師授 來源: raintungli的博客
相關推薦

2012-03-02 12:14:19

JavaJstackJmap

2012-03-02 12:20:21

Javajmapjstack

2012-03-02 12:31:50

Javajmapjstack

2012-03-02 12:25:07

Javajmapjstack

2012-03-02 13:29:38

Javajmapjstack

2022-06-26 18:09:43

Linux開源

2022-05-25 16:38:42

sudoLinuxroot 賬戶

2010-01-27 09:58:59

Linuxunix程序日志

2023-06-06 19:01:38

縮寫ShellLinux

2019-10-16 17:00:51

LinuxUbuntuVMware

2021-03-09 11:25:04

Linux開源工具服務器

2012-05-22 00:28:21

JavaJava開源開源工具

2022-06-06 14:20:25

個人財務開源預算

2015-10-26 09:38:09

免費安全分析工具

2015-12-24 10:10:31

Slack開源工具IRC

2022-12-06 17:18:42

2015-09-16 09:35:10

安全分析安全分析工具安全工具

2023-11-15 17:23:30

測試軟件開發

2021-08-31 09:41:57

LinuxiPhone開源工具

2021-09-01 09:47:25

Linux 工具 開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区久久久久久久久 | 色综合久久久久 | 古典武侠第一页久久777 | 91se在线| 亚洲在线看 | 黄a在线观看| 国产一区中文字幕 | 亚洲欧洲精品成人久久奇米网 | 51ⅴ精品国产91久久久久久 | 亚洲va国产日韩欧美精品色婷婷 | 一级做a爰片性色毛片16美国 | 九九精品在线 | 蜜臀网 | 成人 在线 | www.日本在线 | 中文字幕免费在线 | 欧美成人a∨高清免费观看 91伊人 | 狠狠操天天操 | 久久精品99久久 | 亚洲国产成人精品久久久国产成人一区 | 日韩一区二区三区在线视频 | 午夜视频一区 | 欧美日韩在线一区二区 | 一区二区三区日韩 | 激情av免费看 | 人人九九精 | 欧美精品一区二区在线观看 | 欧美日韩在线看 | 久久人| 麻豆久久久 | 国产色婷婷精品综合在线播放 | 免费日韩av | 亚洲成人高清 | 欧美黑人狂野猛交老妇 | 亚洲综合在线视频 | 一区二区免费视频 | 我要看黄色录像一级片 | 日韩av在线不卡 | 久久久精品综合 | 在线视频中文字幕 | www久久久 |