Tôi cũng có vấn đề này, nhưng tôi sử dụng gdb trong KDevelop thưa thớt đủ đã không làm phiền tôi được nêu ra. Đây là nhật ký của tôi về việc sửa lỗi:
Nhìn qua mã nguồn của GDB 7.3.1 cho thấy rằng thông báo này được in khi GDB cố gắng đặt TTY chính thành tse-tty mới được tạo (xem gdb/stream). c, dòng 683-740). Đặc biệt, một cuộc gọi đến ioctl với yêu cầu TIOCSCTTY không thành công với lỗi quyền.
Với ý nghĩ này, tôi đã xem xét mã nguồn hạt nhân Linux để xem điều gì có thể gây ra lỗi. Một chút tìm kiếm cho thấy rằng nó cuối cùng sẽ biến thành một cuộc gọi đến tiocsctty(). Các bình luận từ tiocsctty đó là quan trọng ở đây:
/*
* The process must be a session leader and
* not have a controlling tty already.
*/
Vì chỉ có lý do khác, nó có thể thất bại với EPERM là nếu tty rằng GDB tạo ra thực sự là một tty kiểm soát cho khác quá trình (mà dường như rất khó), Tôi nghĩ rằng nó hợp lý để giả định rằng GDB không phải là một nhà lãnh đạo phiên. Đủ công bằng, nó được phát triển bởi KDevelop sau khi tất cả!
Vì vậy: Tôi đã thử không khởi chạy phiên GDB trong thiết bị đầu cuối bên ngoài và hoạt động. Đã thu hẹp sự cố.
Ban đầu, dòng thiết bị đầu cuối bên ngoài được đặt thành konsole --noclose --workdir %workdir -e %exe
. Thay đổi điều này thành terminator -e %exe
tạo sự khác biệt nhỏ: KDevelop cảnh báo tôi rằng
GDB cannot use the tty* or pty* devices.
Check the settings on /dev/tty* and /dev/pty*
As root you may need to "chmod ug+rw" tty* and pty* devices and/or add the user to the tty group using "usermod -G tty username".
Tôi đã kiểm tra quyền của mình; người dùng của tôi là một phần của nhóm tty và tất cả các tệp có liên quan đều có thể đọc và ghi được.
Việc tìm hiểu mã nguồn KDevelop cho thấy cách KDevelop thực sự thiết lập thiết bị đầu cuối. Nó chạy tập lệnh shell
tty > FIFO_PATH ; trap "" INT QUIT TSTP ; exec<&-; exec>&-; while :; do sleep 3600;done
và sau đó thiết lập GDB để sử dụng thiết bị đầu cuối mà nó đọc từ FIFO_PATH. (Tên của tôi, nhân tiện, không phải là cái mà KDevelop sử dụng.) Vấn đề (tốt nhất tôi có thể nói) là gdb không được khởi chạy như một phần tử con của kịch bản lệnh shell, và do đó không thể sử dụng nó làm tty chính của nó.
Tôi không cảm thấy muốn vá KDevelop để thực hiện công việc này đúng cách (hoặc tìm kiếm những gì thực sự khiến việc này ngừng hoạt động ngay từ đầu ...), vì vậy tốt nhất tôi có thể đề xuất tại thời điểm này là đơn giản là không sử dụng thiết bị đầu cuối bên ngoài cho mục đích gỡ lỗi.
Chúc may mắn! Tôi sẽ cập nhật nếu tôi thấy bất kỳ điều gì hữu ích.
Chỉ cần một * nitpick * Googling cảnh báo rằng cho hit 6k thực sự. –
Tôi googled rằng cảnh báo nhưng tôi đã không thể sửa chữa nó-đây là lý do tại sao tôi đã viết bài này. – Mythli
Mọi người vẫn sử dụng KDevelop? Tôi đã không chạm vào điều đó trong 10 năm ... –