2009-10-09 2 views
1

자바에서 가능한지 궁금하다는 생각이 들었습니다. eclipse 또는 netbeans를 사용하여 디버깅을 수행 할 때 객체를 기록하고 저장한다고 가정 해 보겠습니다. 그런 다음 디버깅의 두 번째 라운드를 진행할 때 개체를 다시 저장하십시오. 이제 모든 속성에 대해 두 번째 객체와 함께 기록 된 첫 번째 객체를 비교하고 차이점을 찾을 수 있습니다. 이것이 가능한가? 당신은 일반 자바 코드에서이 작업을 수행 할 수 있습니다객체의 시원한 디버깅

+1

이클립스 디버깅이 가까운 무언가를 - 그것은 중단 점 사이의 값/참조를 변경 강조 할 것이다 - 내가 좋아했던 http://www.ibm.com/developerworks/java/library/os-ecbug/ – Nate

답변

5

는 (당신의 객체가 Serializable입니다 가정),하지만 난 어떤 디버거는이 기능이 내장되어 있다고 생각하지 않습니다.

디버깅 실행 중 첫 번째 객체를 직렬화하는 경우가 있습니다 (정적 메서드가있는 경우 일반적으로 디버거에서 호출하여 어딘가에 저장할 수 있음). 그런 다음 두 번째 실행 중에 다른 메서드를 호출하여 직렬화 된 양식에서 개체를 다시 구성한 다음 해당 개체를 비교합니다 (equals() 메서드 또는 일부 맞춤 비교 메서드 사용). 실제로

는 내가이 작업을 수행 할 때마다 난 그냥 종이에 관련된 속성을 낙서와 수동으로 비교 찾을 수 있지만. 드물게 나는 수천 개에서 수천 개의 속성을 볼 수 있습니다. 현재보고있는 증상과 객체의 동작에 대해 생각해 보면 일반적으로 디버거를 시작하기 전에 무엇이 바뀌 었는지에 대해 매우 잘 알고있을 수 있으며, 후자를 사용하여 가설을 확인하고 값이 "잘못되었는지"를 확인하십시오.

+0

의 그림 9 참조 당신이하는 일은 종이에 적어 두는 것뿐입니다. 그리고 그것을하는 더 전문적인 방법을 찾고 – cometta

1

은 개체에게 유용한 toString() 방법을 지정하고 다음 기대와 결과를 비교하기 위해 단위 테스트를 사용합니다.

는하지만 동의는이 작업을 자동으로 수행하는 프로그램을 작성하는 것이 가능해야하므로 원격 디버깅을위한 와이어 프로토콜은 모든 객체를 직렬화 할 수 있습니다.

OTOH는, 직렬화되는 것은 아니다 객체는 위험 할 수 있습니다. 실수로 클래스 로더에서이 코드를 사용하면 모든 객체와 클래스 및 모든 것을 하나의 큰 덩어리로 되돌릴 수 있습니다. 그래서 당신은 깊은 객체 트리에서 혼란을 일으키지 않도록 serialization을 막을 방법이 필요합니다.

그 외에 앱의 현재 상태를 저장하고 시간대에 되돌릴 수있는 기능이 필요합니다.

1

나는 어떤 디버거가 나중에 비교하는 객체를 저장할 수 있다고 생각하지 않습니다. 당신이 생각 할 수있는 것은과 같이 변수에 시계 변수를 만들지 만, 아파치 평민의 ToStringBuilder()으로 포장하고 콘솔에 덤프하는 것입니다

System.out.println(ToStringBuilder.reflectionToString(object)); 

중단 점의에 도달 할 때마다 개체의 내용이 콘솔에 표시됩니다. 개인 데이터를 볼 수도 있습니다.

따라서 개체의 toString() 메서드를 직접 수정할 필요가 없습니다 (예 : 라이브러리 개체에 유용함). 그런 다음 두 패스의 출력을 비교할 수 있습니다.

+0

나에게 멋진 기술보세요. 이것을 지적 해 주셔서 감사합니다. – cometta