리버스 디버깅이 거의 사용되지 않는 이유는 무엇입니까? [닫은]


56

gdb 는 2009 년에 gdb 7.0으로 리버스 디버깅 을 지원했습니다 . 2012 년까지는 들어 본 적이 없습니다. 이제 특정 유형의 디버깅 문제에 매우 유용합니다. 나는 전에 그것을 들었 으면 좋겠다.

내가 틀렸다면 저를 수정하십시오. 제 인상은 기술이 여전히 거의 사용되지 않고 대부분의 사람들이 그 기술이 존재한다는 것을 모른다는 것입니다. 왜?

리버스 디버깅 사용이 일반적인 프로그래밍 커뮤니티를 알고 있습니까?

배경 정보:


47
이 존재 모르는 사람들의 이익을 위해 무엇 역 디버깅은?
메이슨 휠러

5
MS는 자신의 시스템을 intellitrace라고 불렀는데, 이는 revese 디버깅이라고 부르는 것과 비슷해 보였지만 환경에 따라 여러 이름의 문제가 생길 수 있습니다.
Ryathal

1
그만한 가치가있는 것 : 당신이 알고있는 것보다 훨씬 오래되었습니다. Microsoft는 QuickC에서 지원했습니다 (메모리가 제공되는 경우 약 1989 년 또는 90 년).
Jerry Coffin

41
@MasonWheeler, 분명히 역 디버깅은 코드에 버그를 추가하는 행위입니다. 나는 이것이 드문 관행이라는 OP의 전제에 동의하지 않습니다.
Ben Lee

3
@BenLee, 우리는 그것을 다시 디버깅이라고 부릅니다.
OldFart

답변:


26

하나를 들어,에 기록하여 디버그 모드에서 실행하는 것은 매우 심지어 일반 디버그 모드에 비해 비싼; 또한 더 많은 메모리를 소비합니다.

라인 레벨에서 함수 호출 레벨로 세분성을 줄이는 것이 더 쉽습니다. 예를 들어, 일식의 표준 디버거가 복귀되는 힙에서 수행 모든 매개 변수 (아무것도의 리셋 다시 함수의 시작에 점프가 본질적으로하는 "프레임에 드롭"당신이 할 수 있고, finally블록은 실행되지 않습니다 따라서 진정한 리버스 디버거는 아닙니다.

이 기능은 현재 몇 년 동안 제공되어 왔으며 핫 코드 교체와 함께 작동합니다.


1
아주 좋은 대답입니다. 녹음이 비싸다는 것을 확인할 수 있습니다. 응용 프로그램의 중요한 부분을 입력하기 직전에 활성화해야합니다. 항상 간단한 것은 아닙니다. 또한 "드롭 투 프레임"만으로도 충분하다는 데 동의합니다. 그러나 루프 또는 재귀 알고리즘에서는 제대로 작동하지 않습니다.
Philipp Claßen

2
rr ( rr-project.org ) 까지 입니다. rr을 사용하여 실행을 기록하는 동안 속도가 느려집니다. 그런 다음 자주 사용하는 IDE ( github.com/mozilla/rr/wiki/Using-rr-in-an-IDE ) 에서 감시자를 재생, 단계적으로 이동, 되감기, 설정할 수 있습니다 ... 코드를 디버깅하는 방식은 결코 같은.
jyavenard

11

이미 언급했듯이 gdb의 가역적 디버깅의 경우 성능이 핵심입니다. gzip과 같은 것을 실행하면 기본적으로 실행하는 것보다 50,000 배가 느려집니다. 그러나 상업적 대안이 있습니다 : Undo undo.io 에서 일하고 UndoDB 제품은 동일하지만 속도가 2 배 미만입니다. 다른 상용 가역 디버거도 있습니다.


1
흥미롭게도 나는 그것을 시도해 볼 것입니다. 여러 기사에서 비상업적 용도로는 무료이지만 귀하의 홈페이지에서이를 확인하는 정보를 찾지 못했습니다. 아직도 사실입니까? 제휴를 공개해 주셔서 감사합니다.
Philipp Claßen

2
UndoDB의 스타터 및 프로페셔널 버전 가격은 얼마입니까? UndoDB 에디션 페이지에서 볼 수 없습니다.
tcrosley

3
너희들은 어떻게 모질라와 비교해 rr?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

10

기술 선택 및 제품에 대한 개요는 약 1 년 전에 쓴 일련의 블로그 게시물 (그리고 그 이후의 후속 조치)을 참조하십시오.

왜 그렇게 적게 사용되는지에 대한 느낌은 특별한 하드웨어가 필요하거나 특별한 디버거를 사용하거나 시스템을 올바르게 설정한다는 것입니다. 불행히도 대부분의 사람들은 디버그 툴을 최대한 활용하기 위해 시간을 투자하지 않습니다.

그리고 gdb의 "저렴한 기본값"은 거의 사용할 수 없을 정도로 느리고 가장 일반적인 대상 시스템을 제외한 모든 시스템에서 안정성 문제가 거의 없습니다.


4

TotalView 디버거의 영업 엔지니어로서의 경험을 통해 사람들은 그것이 존재한다는 것을 알고 있지만 (허용 가능한지) 둔화에 관계없이 작동한다고 생각하지 않습니다.

케임브리지 대학교는 최근에 "역전 디버깅 비용을 채택하는 데 실패한 글로벌 경제 연간 420 억 달러" 라는 제목의 설문 조사를 실시했습니다 .

그리고 GDB로 돌아 왔을 때, "실제"응용 프로그램에서는 속도 저하로 인해 사용할 수 없다고 들었습니다.

개인적으로 "Hello world!"이외의 응용 프로그램에서 리버스 디버깅을 사용하는 더 많은 사람들의 의견을 듣고 싶습니다.


4
연구를 가장 한 것으로 보이는 'Undo Software'스팸보다는이 연구를 연결하는 것이 훨씬 낫다고 생각합니다.
Bulwersator

1
전직에서 리버스 디버거 ( ghs.com/products/timemachine.html )를 만들었습니다 . 우리는 디버거를 내부적으로 많이 사용했으며, 믿을 수 없었습니다. 물론 그것은 정말로 털이 많은 경쟁 조건에서 훌륭했지만 그 이상이었습니다. 항상 리버스 디버깅을 수행하면 디버깅 변경에 대한 사고 방식이 달라집니다. 반복 횟수가 줄어들고 코드 테스트 방법에 대한주의가 줄어 듭니다. 실행 실행을 저장하여 다른 사람에게 보낼 수도 있으므로 다른 사람의 코드에서 버그를 찾는 데 좋습니다.
speedplane

2

이 "역방향"또는 "역사적"디버깅에 대해 조금 더 확장하는 것이 중요하다고 생각합니다. 나는 그 시스템의 복잡한 시스템과 행동을 이해하고 상태를 명시 적으로 만드는 "이벤트"를 재생하는 것이 절대적으로 중요하다고 생각합니다.

내가 표현하고자하는 것은 오늘날이 기술이 왜 그렇게 많이 적용되지 않았는지 또는 왜 관련 문제가 명확하게 논의되지 않는지 궁금해하는 데 혼자가 아니라는 것입니다.

여기서 두 가지 매우 중요한 개념을 강조하겠습니다.

1. 프로그래밍 시스템을 이해하려면 상태를 명시 적으로 만드는 것이 도움이됩니다

프로그래밍 시스템의 상태 시퀀스 (이벤트)를 더 잘 이해하려면 많은 도움이 될 수 있습니다.

다음은 문제를 해결하고 문제에 대한 해결책을 제안하거나 설계 한 소스입니다 (복잡한 시스템의 상태 처리).

-타르 비트를 벗어난 용지 : http://shaffner.us/cs/papers/tarpit.pdf 주요 아이디어 : 피하거나 격리하거나 상태를 명시 적으로 지정

-CQRS http://www.cqrs.nu/ 이것은 명령 쿼리 분리 및 이벤트 소싱이라는 두 가지 개념의 조합입니다. 다른 구현 (Java, C #, Scala)이 있습니다. 테이트 시퀀스의 재생과 도메인 모델의 진화는 여기서 중요한 부분입니다.

당신이 경우 정말 축소와 매우 광범위한 사진을 볼 이미 가진 것을 볼 수있는이 상태가 명시 적으로 만들기 때문에 이미 ((UN)이 의식적으로) FP에 매력을 함수형 프로그래밍 사람들의 "상승"! 그러나 그것은 하나의 포인트만을 다루고, 두 번째를 다루기 위해서는 기능적으로 반응하는 프로그래밍으로 "느슨하게"묘사 될 수있는 다른 개념이 필요합니다.

그렇다면 CQRS와 FRP를 실제로 사용하는 사람은 누구입니까? 나는 (구체적인 숫자가 없기 때문에 IMO) 실제로 많은 회사들이 그들이하는 일이이 용어를 가지고 있다는 것을 모른다는 것입니다. 어쩌면 당신은 약간의 구글을하고 CQRS를 사용하는 기업들로부터 소식을 듣고, 이미 성공 사례가 몇 가지 있습니다. : FRP 너무 나는 넷플릭스 줄 수있는 예제로 천천히 상승 http://techblog.netflix.com/2013/02/rxjava-netflix-api.html 단지를 기반으로 실제로 .NET 인 RX의 구현을 발표했다 (그러나이 자바 스크립트 구현도). 오늘날 사람들은 복잡한 시스템을 이해하고 더 나은 시스템을 만들기 위해 이러한 기술을 이미 사용하고 있습니다. 이것이 리버스 디버깅 기술을 사용하는 이유입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.