시스템 튜토리얼 리눅스 Linux 디버거에 대한 고급 주제에 대한 심층 분석

Linux 디버거에 대한 고급 주제에 대한 심층 분석

Jan 08, 2024 pm 10:42 PM
linux 리눅스 튜토리얼 레드햇 리눅스 시스템 리눅스 명령 리눅스 인증 빨간 모자 리눅스 리눅스 비디오

소개 드디어 이 시리즈의 마지막 기사에 이르렀습니다! 이번에는 원격 디버깅, 공유 라이브러리 지원, 식 평가, 멀티스레딩 지원 등 디버깅의 고급 개념에 대한 높은 수준의 개요를 제공하겠습니다. 이러한 아이디어는 구현하기가 더 복잡하므로 수행 방법을 자세히 설명하지는 않겠습니다. 하지만 질문이 있는 경우 이러한 개념에 대한 질문에 기꺼이 답변해 드리겠습니다.
시리즈 색인
  1. 환경을 준비하세요
  2. 중단점
  3. 레지스터와 메모리
  4. 엘프와 드워프
  5. 소스 코드 및 신호
  6. 소스 코드 레이어는 단계별로 실행됩니다
  7. 소스 코드 레이어 중단점
  8. 콜 스택
  9. 변수 처리
  10. 프리미엄 테마
원격 디버깅

원격 디버깅은 임베디드 시스템이나 다양한 환경 디버깅에 매우 유용합니다. 또한 높은 수준의 디버거 작업과 운영 체제 및 하드웨어와의 상호 작용 사이에 미세한 경계를 설정합니다. 실제로 GDB 및 LLDB와 같은 디버거는 로컬 프로그램을 디버깅할 때에도 원격 디버거로 실행될 수 있습니다. 일반적인 구조는 다음과 같습니다:
Linux 调试器之高级主题!

디버그 아카이브

디버거는 명령줄을 통해 상호 작용하는 구성 요소입니다. IDE를 사용하는 경우 그 위에 머신 인터페이스를 통해 디버거와 통신하는 또 다른 레이어가 있을 수도 있습니다. 대상 머신(아마도 네이티브 머신과 동일)에는 이론적으로 주소에 중단점 설정과 같은 모든 하위 수준 디버깅 작업을 수행하는 매우 작은 운영 체제 디버깅 라이브러리 주변의 래퍼인 디버그 스텁이 있습니다. 요즘 디버그 스텁이 점점 더 커지고 있기 때문에 "이론적으로"라고 말합니다. 예를 들어 내 컴퓨터의 LLDB 디버그 스텁 크기는 7.6MB입니다. 디버그 스텁은 일부 운영 체제별 기능(이 경우 ptrace)을 사용하여 원격 프로토콜을 통해 디버깅된 프로세스 및 디버거와 통신합니다.
가장 일반적인 원격 디버깅 프로토콜은 GDB 원격 프로토콜입니다. 이는 디버거와 디버그 스텁 간에 명령과 정보를 전달하는 데 사용되는 텍스트 기반 패킷 형식입니다. 자세한 내용은 다루지 않겠습니다. 여기에서 더 자세한 내용을 읽어보실 수 있습니다. LLDB를 시작하고 log 활성화 gdb-remote packets 명령을 실행하면 원격 프로토콜을 통해 전송된 모든 패킷에 대한 추적을 얻을 수 있습니다. GDB에서는 set remotelogfile을 사용하여 동일한 작업을 수행할 수 있습니다.

간단한 예로 다음은 중단점을 설정하는 패킷입니다.

으아아아

$는 패킷의 시작을 표시합니다. Z0은 메모리 중단점을 삽입하는 명령입니다. 400570과 1은 매개변수로 전자는 중단점을 설정하는 주소이고 후자는 특정 대상에 대한 중단점 유형 지정자입니다. 마지막으로 #43은 데이터가 손상되지 않았는지 확인하는 체크섬입니다.

GDB 원격 프로토콜은 사용자 정의 패킷으로 확장하기가 매우 쉽고, 이는 플랫폼이나 언어별 기능을 구현하는 데 유용합니다.

공유 라이브러리 및 동적 로딩 지원

디버거는 중단점을 설정하고 소스 코드 수준 정보 및 기호 등을 얻을 수 있도록 디버깅 중인 프로그램에 의해 로드되는 공유 라이브러리를 알아야 합니다. 동적으로 연결된 라이브러리를 찾는 것 외에도 디버거는 런타임 시 dlopen을 통해 로드되는 라이브러리도 추적해야 합니다. 이러한 목적을 달성하기 위해 동적 링커는 교차 구조를 유지합니다. 이 구조는 공유 라이브러리 설명자의 연결된 목록과 연결된 목록이 업데이트될 때마다 호출되는 함수에 대한 포인터를 유지 관리합니다. 이 구조는 ELF 파일의 .dynamic 섹션에 저장되며 프로그램 실행 전에 초기화됩니다.

간단한 추적 알고리즘:

  • 트레이서는 ELF 헤더에서 프로그램 항목을 찾습니다(또는 /proc//aux에 저장된 보조 벡터를 사용할 수 있음).
  • 추적 프로그램은 프로그램 시작 부분에 중단점을 설정하고 실행을 시작합니다.
  • 브레이크포인트에 도달하면 ELF 파일에서 .dynamic의 로드 주소를 찾아 교차 구조의 주소를 찾습니다.
  • 현재 로드된 라이브러리 목록은 교차 구조를 확인하세요.
  • 링커 업데이트 기능에 중단점을 설정합니다.
  • 목록은 중단점에 도달할 때마다 업데이트됩니다.
  • 추적 프로그램은 무한 반복되며 프로그램을 계속 실행하고 추적 프로그램 신호가 종료될 때까지 신호를 기다립니다.

저는 이러한 개념에 대한 간단한 예를 작성했으며 여기에서 찾을 수 있습니다. 누구든지 관심이 있다면 앞으로 더 자세히 글을 쓸 수 있습니다.

표현식 계산

표현식 평가는 사용자가 프로그램을 디버깅하는 동안 원래 소스 언어의 표현식을 평가할 수 있는 프로그램의 기능입니다. 예를 들어, LLDB 또는 GDB에서는 print foo()를 실행하여 foo 함수를 호출하고 결과를 인쇄할 수 있습니다.

표현의 복잡성에 따라 여러 가지 계산 방법이 있습니다. 표현식이 단순한 식별자인 경우 디버거는 이 시리즈의 마지막 부분에서 했던 것처럼 디버그 정보를 보고 변수를 찾아 값을 인쇄할 수 있습니다. 표현식이 다소 복잡한 경우 코드를 중간 표현식(IR)으로 컴파일하고 해석하여 결과를 얻는 것이 가능할 수 있습니다. 예를 들어 일부 표현식의 경우 LLDB는 Clang을 사용하여 표현식을 LLVM IR로 컴파일하고 해석합니다. 표현식이 더 복잡하거나 특정 함수를 호출해야 하는 경우 코드를 대상으로 JIT화하고 디버기의 주소 공간에서 실행해야 할 수도 있습니다. 여기에는 mmap을 호출하여 일부 실행 가능 메모리를 할당한 다음 컴파일된 코드를 해당 블록에 복사하고 실행하는 작업이 포함됩니다. LLDB는 LLVM의 JIT 기능을 사용하여 구현됩니다.

JIT 컴파일에 대해 더 자세히 알아보고 싶다면 해당 주제에 대한 Eli Bendersky의 기사를 적극 추천합니다.

多线程调试支持

本系列展示的调试器仅支持单线程应用程序,但是为了调试大多数真实程序,多线程支持是非常需要的。支持这一点的最简单的方法是跟踪线程的创建,并解析 procfs 以获取所需的信息。

Linux 线程库称为 pthreads。当调用 pthread_create 时,库会使用 clone 系统调用来创建一个新的线程,我们可以用 ptrace 跟踪这个系统调用(假设你的内核早于 2.5.46)。为此,你需要在连接到调试器之后设置一些 ptrace 选项:

ptrace(PTRACE_SETOPTIONS, m_pid, nullptr, PTRACE_O_TRACECLONE);
로그인 후 복사

现在当 clone 被调用时,该进程将收到我们的老朋友 SIGTRAP 信号。对于本系列中的调试器,你可以将一个例子添加到 handle_sigtrap 来处理新线程的创建:

case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):
//get the new thread ID
unsigned long event_message = 0;
ptrace(PTRACE_GETEVENTMSG, pid, nullptr, message);
//handle creation
//...
로그인 후 복사

一旦收到了,你可以看看 /proc//task/ 并查看内存映射之类来获得所需的所有信息。

GDB 使用 libthread_db,它提供了一堆帮助函数,这样你就不需要自己解析和处理。设置这个库很奇怪,我不会在这展示它如何工作,但如果你想使用它,你可以去阅读这个教程。

多线程支持中最复杂的部分是调试器中线程状态的建模,特别是如果你希望支持不间断模式或当你计算中涉及不止一个 CPU 的某种异构调试。

最后!

呼!这个系列花了很长时间才写完,但是我在这个过程中学到了很多东西,我希望它是有帮助的。如果你有关于调试或本系列中的任何问题,请在 Twitter @TartanLlama或评论区联系我。如果你有想看到的其他任何调试主题,让我知道我或许会再发其他的文章。

위 내용은 Linux 디버거에 대한 고급 주제에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DeepSeek 웹 버전 입구 DeepSeek 공식 웹 사이트 입구 DeepSeek 웹 버전 입구 DeepSeek 공식 웹 사이트 입구 Feb 19, 2025 pm 04:54 PM

DeepSeek은 웹 버전과 공식 웹 사이트의 두 가지 액세스 방법을 제공하는 강력한 지능형 검색 및 분석 도구입니다. 웹 버전은 편리하고 효율적이며 설치없이 사용할 수 있습니다. 개인이든 회사 사용자이든, DeepSeek를 통해 대규모 데이터를 쉽게 얻고 분석하여 업무 효율성을 향상시키고 의사 결정을 지원하며 혁신을 촉진 할 수 있습니다.

DeepSeek을 설치하는 방법 DeepSeek을 설치하는 방법 Feb 19, 2025 pm 05:48 PM

Docker 컨테이너를 사용하여 사전 컴파일 된 패키지 (Windows 사용자의 경우)를 사용하여 소스 (숙련 된 개발자)를 컴파일하는 것을 포함하여 DeepSeek를 설치하는 방법에는 여러 가지가 있습니다. 공식 문서는 신중하게 문서를 작성하고 불필요한 문제를 피하기 위해 완전히 준비합니다.

Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Linux 터미널에서 Python 버전을 볼 때 발생하는 권한 문제를 해결하는 방법은 무엇입니까? Apr 01, 2025 pm 05:09 PM

Linux 터미널에서 Python 버전을 보려고 할 때 Linux 터미널에서 Python 버전을 볼 때 권한 문제에 대한 솔루션 ... Python을 입력하십시오 ...

Bitget 공식 웹 사이트 설치 (2025 초보자 안내서) Bitget 공식 웹 사이트 설치 (2025 초보자 안내서) Feb 21, 2025 pm 08:42 PM

Bitget은 스팟 거래, 계약 거래 및 파생 상품을 포함한 다양한 거래 서비스를 제공하는 Cryptocurrency 교환입니다. 2018 년에 설립 된이 교환은 싱가포르에 본사를두고 있으며 사용자에게 안전하고 안정적인 거래 플랫폼을 제공하기 위해 노력하고 있습니다. Bitget은 BTC/USDT, ETH/USDT 및 XRP/USDT를 포함한 다양한 거래 쌍을 제공합니다. 또한 Exchange는 보안 및 유동성으로 유명하며 프리미엄 주문 유형, 레버리지 거래 및 24/7 고객 지원과 같은 다양한 기능을 제공합니다.

Gate.io 설치 패키지를 무료로 받으십시오 Gate.io 설치 패키지를 무료로 받으십시오 Feb 21, 2025 pm 08:21 PM

Gate.io는 사용자가 설치 패키지를 다운로드하여 장치에 설치하여 사용할 수있는 인기있는 cryptocurrency 교환입니다. 설치 패키지를 얻는 단계는 다음과 같습니다. Gate.io의 공식 웹 사이트를 방문하고 "다운로드"를 클릭하고 해당 운영 체제 (Windows, Mac 또는 Linux)를 선택하고 컴퓨터에 설치 패키지를 다운로드하십시오. 설치 중에 항 바이러스 소프트웨어 또는 방화벽을 일시적으로 비활성화하여 원활한 설치를 보장하는 것이 좋습니다. 완료 후 사용자는 GATE.IO 계정을 만들려면 사용을 시작해야합니다.

Ouyi OKX 설치 패키지가 직접 포함되어 있습니다 Ouyi OKX 설치 패키지가 직접 포함되어 있습니다 Feb 21, 2025 pm 08:00 PM

세계 최고의 디지털 자산 거래소 인 Ouyi Okx는 이제 안전하고 편리한 거래 경험을 제공하기 위해 공식 설치 패키지를 시작했습니다. OUYI의 OKX 설치 패키지는 브라우저를 통해 액세스 할 필요가 없습니다. 설치 프로세스는 간단하고 이해하기 쉽습니다. 사용자는 최신 버전의 설치 패키지를 다운로드하고 설치를 단계별로 완료하면됩니다.

시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? 시스템 재시작 후 UnixSocket의 권한을 자동으로 설정하는 방법은 무엇입니까? Mar 31, 2025 pm 11:54 PM

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

Ouyi Exchange 다운로드 공식 포털 Ouyi Exchange 다운로드 공식 포털 Feb 21, 2025 pm 07:51 PM

OKX라고도하는 Ouyi는 세계 최고의 암호 화폐 거래 플랫폼입니다. 이 기사는 OUYI의 공식 설치 패키지 용 다운로드 포털을 제공하여 사용자가 다른 장치에 OUYI 클라이언트를 설치할 수 있도록합니다. 이 설치 패키지는 Windows, Mac, Android 및 iOS 시스템을 지원합니다. 설치가 완료되면 사용자는 OUYI 계정에 등록하거나 로그인하고 암호 화폐 거래를 시작하며 플랫폼에서 제공하는 기타 서비스를 즐길 수 있습니다.

See all articles