Handler 에서 JNI 사용 시 EXCEPTION_ACCESS_VIOLATION 오류 발생

103 views
Skip to first unread message

A-YUL's Daddy

unread,
Feb 7, 2021, 9:31:14 PM2/7/21
to Netty Korean User Group
안녕하세요 

netty 를 이용하여 아래와 같은 간단한 application을 개발해보고 있습니다.

1. Network 를 통해 전문 데이터 수신 하여 파일로 저장 
2. 저장한 파일을 dll을 이용하여 분석 

개발환경
 - windows10, openjdk11, spring boot, netty 

[개발 내용 요약]
 - main class 에서는 ApplicationListener를 이용하여 tcpServer.start(); (정상)
 - channel init 시 pipeline 에 ByteArrayDecoder 등록 (정상)
 - handler 로 fileSaveHandler.java 등록 (정상)
 - fileSaveHandler 에서 byte[] 로 받아 parsing 및 file 저장 (정상)
 - fileSaveHandler 에서 file 저장 후 file 을 분석하는 dll을 호출하는 native method 호출
   > EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb41dba770, pid=14136, tid=23428 에러 발생 

[참고]
 - TestScheduler.java (@Component) 를 만들어 @Scheduled cron 으로 돌려서 dll을 호출하는 native method 호출 시 정상 동작함

[문의]
- 잘못된 메모리 참조로 인해 발생하는 문제로 예상하고 있는데... childchannel 에서 어떻게 사용해야 할지 모르겠네요. 
 - 자세한 에러내용은 파일로 첨부 했습니다.
 - 도움 부탁 드립니다.

hs_err_pid7548.log

권석훈

unread,
Feb 7, 2021, 10:06:41 PM2/7/21
to nett...@googlegroups.com
파일 저장하는 작업과 dll을 이용하여 분석하는 작업을  다른 프로세스로  분리하여 처리하는게 어떨까 싶습니다..
dll을 작업을 invoke 시키는 것은 메세지큐나 파일모니터링 같은 걸로 처리하구요...



2021년 2월 8일 (월) 오전 11:31, A-YUL's Daddy <kim...@gmail.com>님이 작성:
--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/netty-ko/883996a9-493e-4a6b-833c-2861abbdfc8en%40googlegroups.com을(를) 방문하세요.

김영회

unread,
Feb 8, 2021, 4:02:30 AM2/8/21
to Netty Korean User Group
안녕하세요, 답변 감사합니다.

일단 handler 에서는 파일을 저장만 하고 file 경로가 담긴 dto 를 (파싱 결과: 파일정보 + 기타 정보) concurrentqueue 에 담고
scheduler 에서 해당 queue 에 담긴 dto를 get 하여 파일을 분석하는 방향으로 진행하고 있습니다..

혹시 번외로 아래와 같은 상황에 대해서 도움 받을 수 있을까요?

1. 파일 사이즈가 작은 것은 decoder 를 통해 handler 의 channelRead 로 한번에 들어옴 - log.info() 찍어보면 한벅 찍힘
2. 파일 사이즈가 클 경우 channelRead 에 여러번 나뉘어서 들어옴
3. channelRead 에서는 Object msg 를 byte[]로 casting 하여 파싱하는 작업 (byte 전문에 사용자 정보와 기타 정보 + 파일데이터 가 포함되어 있음)을 하고 있는데
    2번 처럼 여러번에 나뉘어져 들어오다 보니 파일이 제대로 저장이 안되고 파싱이 실패함 
4. decoder 에서 out.add(ByteBufUtil.getBytes(msg)); 하기 전에 무언가 체크 해서 return 처리 하도록 해야 하는지?
   ex) TCP Header 에 보내는 전체 byte size를 보내라고 해서 decoder 에서 해당 size 만큼 다 들어오기 전에 return 한다?
         만약 이렇게 하려면 decoder 를 ChannelHandler.Sharable 하지 않고 매번 new 해야 하는건지?

이제 막 netty를 시작하는 중이라... 많이 부족 합니다. 

2021년 2월 8일 월요일 오후 12시 6분 41초 UTC+9에 필그림님이 작성:

Joo Sing

unread,
Feb 9, 2021, 1:54:40 AM2/9/21
to Netty Korean User Group
안녕하세요. 저도 Netty 열심히 공부중인데요. Netty 그룹의 글들을 읽다보니 비슷한 문제로 어려움는 분들이 많은 것 같아요.

아래 다른 글에 남긴 내용인데 TCP 프로토콜의 Stream-oriented 한 특징을 먼저 잘 이해해야 할 것 같아요. ( https://groups.google.com/g/netty-ko/c/IcRU-Qoaw7w ) 여기 제가 남긴 글에 레퍼런스들이 있는데 한 번 참고하시면 이론적으로 이해에 도움이 되실 것 같아요.

그리고 김영희님께서 주고 받는 Application 단의 프로토콜 (byte 전문에 사용자 정보와 기타 정보 + 파일데이터 가 포함되어 있음)에 예상하기로는 메시지 길이 필드가 있을 것 같아요. 그게 맞다면 LengthFieldBasedFrameDecoder 이 프레임 디코더를 Pipeline 제일 앞단에 추가해 주시면 될 것 같아요. 이외에도 ByteToMessageDecoder 하위 클래스들에 다양한 메시지를 구분해 주는 디코더들이 정의되어 있으니 참고하시거나, 직접 구현도 가능하실 것 같아요.  xxxFrameDecoder 들은 Sender가 TCP를 통해 전송한 의미있는 하나의 메시지를 다양한 메커니즘에 의해 하나의 메시지로 만들어서 다음 Handler로 전달해 주는 기능을 하는 것 같습니다. 

TCP를 통해 메시지를 전송할 때, 메시지를 구분지어 주는 메커니즘과 관련 FrameDecoder들은 대표적으로 아래 정도가 있을 것 같아요. 
- 고정 길이 메시지 : FixedLengthFrameDecoder (고정 길이 만큼 항상 읽어서 다음 Handler 전달)
- 고정 길이 헤더에 가변 길이 필드를 명시적 가지는 가변길이 메시지 : LengthFieldBasedFrameDecoder (고정 길이 헤더가 4바이트면 4바이트를 항상 읽고,  헤더 내 가변 길이 필드를 읽은 후에 뒤 이어오는 가변길이 메시지를 읽어서  다음 Handler 전달) 
- 가별 길이 메시지 끝에 End Tag가 추가된 메시지 :  DelimiterBasedFrameDecoder (End Tag 단위로 메시지를 읽어서 다음 Handler 전달)

위 내용들을 이해하시고 한 번 적용해 보시면 어떨까 싶습니다. 저도 곧 적용해 보려고 공부중입니다. 

2021년 2월 8일 월요일 오후 6시 2분 30초 UTC+9에 김영회님이 작성:

김영회

unread,
Feb 9, 2021, 2:35:36 AM2/9/21
to Netty Korean User Group
안녕하세요 도움 주셔서 고맙습니다. 

일단 저는 Handler 에 ByteBuf, totalSize 변수를 두고 totalSize 만큼 모두 read 되었을 때 다음 Business Logic 을 처리하도록 해결 했습니다. 

처리한 내용은 블로그 (https://blog.naver.com/spdlqjdudghl/222237616164) 에 정리 해 두었습니다. 

말씀해 주신 decoder 들로 처리 가능한지도 꼭 테스트 해 보겠습니다. 

고맙습니다. 

2021년 2월 9일 화요일 오후 3시 54분 40초 UTC+9에 joosi...@gmail.com님이 작성:
Reply all
Reply to author
Forward
0 new messages