2013-11-26 4 views
8

gdb-many-windows으로 설정된 이맥스 24에서 GDB를 사용합니다. 대개 자체 프레임으로 설정합니다. 나는 별도의 편집 틀을 갖고 싶어. 다음과 같이 보입니다 (ASCII ASCII 다이어그램에 사과드립니다) :Emacs/GDB : 항상 특정 창에서 소스를 gdb-many-windows로 표시합니다.

+-------------+-------------+ 
| gdb   | locals  | 
+-------------+-------------+ 
| source  | I/O   | 
|    |    | 
+-------------+-------------+ 
| stack  | breakpoints | 
+-------------+-------------+ 

큰 문제를 제외하고는 꽤 잘 돌아갑니다. gdb가 up/down/step 후에 다른 소스 버퍼를 표시해야 할 때마다 "소스"창에 항상 표시되지는 않습니다. 예를 들어, 다른 프레임의 창에 동일한 버퍼가 열린 경우 키보드 포커스를 gdb 프레임에 유지하면서 해당 프레임을 올립니다. 프레임이 서로를 커버 할 때 은 실제로 단일 모니터 설정에서을 성가 시게합니다.

동일한 소스 버퍼가 다른 곳에 표시되는지에 관계없이 gdb가 항상 소스를 표시하기 위해 gdb-many-windows 설정의 소스 창을 사용하고 싶습니다. 어떻게해야합니까?


편집 : 더 자세한 지침을 재현. Emacs 24.2.1과 GDB 7.5 - 우분투를 사용하고 있습니다. 계피와 함께 Ubuntu 10.04와 Linux Mint Nadia에서이 문제를 보았습니다.

  • 이 식을 평가 : (setq gdb-many-windows t)
  • 적어도 두 개의 파일이있는 C 프로그램을 컴파일합니다. 예를 들어

:

// foo.c 
void bar(int); 
void foo(int c) { 
    if (c > 0) 
    bar(c - 1); 
} 
int main(void) { 
    foo(100); 
    return 0; 
} 

// bar.c 
void foo(int c); 
void bar(int c) { 
    if (c > 0) 
    foo(c - 2); 
} 

// compile with gcc -g -O0 foo.c bar.c -o test 
  • 보자는 메인 프레임에 표시 bar.c. M-x 5 2으로 새 프레임을 엽니 다. 해당 프레임에서 M-x gdb으로 gdb를 시작하십시오. 위에 표시된 것처럼 프레임에는 여섯 개의 창이 있어야합니다. GDB 프레임을 소스 프레임 위에 놓습니다.
  • main에 중단 점을 설정하고 foobar을 호출합니다. bar이 호출되면 bar.c가 이미 보이기 때문에 메인 프레임은 gdb 프레임 위로 올라갑니다. 그러나 키보드 포커스는 gdb 프레임에 머물러 있습니다.

나는 문제 기능이 gud.el.gz에서 gdb-display-source-buffer이라고 생각합니다. defadvice으로이 문제를 재정의하려고 계획하고 있지만 충고에 익숙하지 않습니다. 알아 내면 여기에 답변을 게시 할 것입니다.

+0

문제를 재현 할 수 없습니다. –

+0

@ Jay Conrod : 아직도이 문제가 있는지 알려주세요. 그렇다면 Emacs와 gdb의 정식 버전 번호를 알려주십시오. 또한'emacs -q' 명령을 사용하여 설정상의 잠재적 문제를 찾아보십시오. 또한 최소한의 예를 제시하십시오. 즉, 작은 소스 파일과 문제를 재현하기위한 단계별 지침. – Tobias

+0

@Tobias, 재현 할 자세한 지침을 추가했습니다. 내가 다른 것을 분명히 할 수 있는지 알려줘. –

답변

1

나는 24.3을 가지고있다. 그리고이 버전에서는 문제를 재현 할 수 없습니다.

(defun gud-display-line (true-file line) 
    (let* ((last-nonmenu-event t) ; Prevent use of dialog box for questions. 
    (buffer 
     (with-current-buffer gud-comint-buffer 
     (gud-find-file true-file))) 
    (window (and buffer 
       (or (get-buffer-window buffer) 
       (display-buffer buffer)))) 
    (pos)) 
    (when buffer 
     (with-current-buffer buffer 
    (unless (or (verify-visited-file-modtime buffer) gud-keep-buffer) 
     (if (yes-or-no-p 
      (format "File %s changed on disk. Reread from disk? " 
       (buffer-name))) 
      (revert-buffer t t) 
     (setq gud-keep-buffer t))) 
    (save-restriction 
     (widen) 
     (goto-char (point-min)) 
     (forward-line (1- line)) 
     (setq pos (point)) 
     (or gud-overlay-arrow-position 
      (setq gud-overlay-arrow-position (make-marker))) 
     (set-marker gud-overlay-arrow-position (point) (current-buffer)) 
     ;; If they turned on hl-line, move the hl-line highlight to 
     ;; the arrow's line. 
     (when (featurep 'hl-line) 
     (cond 
     (global-hl-line-mode 
      (global-hl-line-highlight)) 
     ((and hl-line-mode hl-line-sticky-flag) 
      (hl-line-highlight))))) 
    (cond ((or (< pos (point-min)) (> pos (point-max))) 
      (widen) 
      (goto-char pos)))) 
     (when window 
    (set-window-point window gud-overlay-arrow-position) 
    (if (eq gud-minor-mode 'gdbmi) 
     (setq gdb-source-window window)))))) 

window 설정은 당신 완전히 다른 다음과 같이 이 gud-display-line 보인다. 어쩌면 위의 코드가 도움이 될 수도 있고 아니면 새로운 gud/gdb 파일로 업그레이드해야 할 수도 있습니다.

+0

고마워요. 다음 날 또는 2 일 후에 곧 업그레이드를 시도하겠습니다. 나는 약간 회의적이다. 왜냐하면'get-buffer-window'가 여전히 거기에 있기 때문에 문제가 더 일찍 일어난 것 같다. –

+0

나는'emacs -q'로 시작하고, 많은 c- 파일을 열고, 세 개의 프레임을 열고, 프레임을 최대화하는 등 여러 시나리오를 시도했다. 이 문제는 emacs 24.3으로 다시 생성 될 수 없습니다. 'emacs -q'로 해봤습니까? – Tobias

+0

집에서 이맥을 24.3으로 업그레이드했는데 더 이상 문제가 보이지 않습니다. 위/아래/프레임도 예상대로 작동합니다. 왜 그것이 정확하게 작동하는지 모르지만 그것은 그렇습니다! 당신의 도움을 주셔서 감사합니다. –

2

이 문제를 일으키는 함수는 실제로 gud.el.gz에서 gud-display-line입니다. 이 함수는 현재 줄의 소스 윈도우에 오버레이 화살표를 배치하고 이것이 보이는 지 확인합니다. 여기에 논리이다 : 나는 모든 기능을 대체 할 defadvice을 사용

(let* ... 
(window (and buffer 
      (or (get-buffer-window buffer) 
      (if (eq gud-minor-mode 'gdbmi) 
       (or (if (get-buffer-window buffer 'visible) 
        (display-buffer buffer nil 'visible)) 
       (unless (gdb-display-source-buffer buffer) 
       (gdb-display-buffer buffer nil 'visible)))) 
      (display-buffer buffer)))) 

는; 기본적으로 소스를 복사하고 창 선택 로직을 변경했습니다.

(defadvice gud-display-line (around do-it-better activate) 
    (let* ... 
    (window (and buffer 
        (or (if (eq gud-minor-mode 'gdbmi) 
          (unless (gdb-display-source-buffer buffer) 
          (gdb-display-buffer buffer nil 'visible))) 
         (get-buffer-window buffer) 
         (display-buffer buffer)))) 
    ...) 

분명히 가장 우아한 해결책은 아닙니다. 프레임을 (위/아래/프레임으로) 전환 할 때도 도움이되지 않으므로 이것을 이해할 때 편집하겠습니다.

+1

많은 감사합니다. 내 문제를 해결했습니다 :) – OLL

+0

defadvice를 사용하면 emacs24-common 24.4 + 1-5를 사용하여 데비안 Jessie에서 저에게 도움이되었습니다. 누구든지 버그 보고서와 패치를 제출 했습니까? 불완전하더라도 어떤 방식 으로든 다시보고 할 가치가 있습니다. 아마도 관리자가 문제를 알고 있다면 충분히 적용 할 수 있을까요? –

-1

나는 이맥스 24.5를 실행하고 나에게는 여전히 문제가있다. 나는 주로 다음과 같은 기능을 현재 전용 창문이 수동으로 창을 관리 :

(defun gdb-restore-windows-gud-io-and-source() 
    "Restore GUD buffer, IO buffer and source buffer next to each other." 
    (interactive) 
    ;; Select dedicated GUD buffer. 
    (switch-to-buffer gud-comint-buffer) 
    (delete-other-windows) 
    (set-window-dedicated-p (get-buffer-window) t) 
    (when (or gud-last-last-frame gdb-show-main) 
    (let ((side-win (split-window nil nil t)) 
      (bottom-win (split-window))) 
     ;; Put source to the right. 
     (set-window-buffer 
     side-win 
     (if gud-last-last-frame 
      (gud-find-file (car gud-last-last-frame)) 
     (gud-find-file gdb-main-file))) 
     (setq gdb-source-window side-win) 
     ;; Show dedicated IO buffer at the bottom. 
     (set-window-buffer 
     bottom-win 
     (gdb-get-buffer-create 'gdb-inferior-io)) 
     (set-window-dedicated-p bottom-win t)))) 

이 왼쪽 상단에있는 GUD 창을 보여줍니다이, 하단의 IO 버퍼가 왼쪽과 오른쪽에 소스 버퍼를 설정합니다. GUD 및 IO 버퍼는 전용으로 설정됩니다.