2010-06-29 4 views
1

저는 임베디드 시스템에서 실행되는 상당히 큰 프로젝트 작업을하고 있습니다. 어떤 스레드가 어떤 클래스에서 어떤 함수를 호출했는지와 어떤 시간에 어떤 로깅 기능을 추가하고 싶습니다. 예, 여기에 로그 파일의 전형적인 라인의 모습 내용은 다음과 같습니다내 전체 프로젝트에서 어떤 클래스의 어떤 함수를 호출하고 어떤 시간에 스레드를 기록 할 수 있습니까?

시간 - 스레드 이름 - 기능 이름 - 클래스 이름

나는 어떤을 실행할 것의 _penter 후크 함수를 사용하여이 작업을 수행 할 수 있다는 것을 알고 내 프로젝트 내에서 호출 된 모든 함수의 시작 부분에 있습니다 (출처 : http://msdn.microsoft.com/en-us/library/c63a9b7h%28VS.80%29.aspx). 그런 다음 _penter가 호출 된 함수, 클래스 및 스레드를 찾는 데 도움이되는 라이브러리를 찾을 수있었습니다. 그러나 VC++ 특정 이후이 솔루션을 사용할 수 없습니다.

비 VC++ 구현에서 지원하는 다른 방법이 있습니까? ARM/Thumb C/C++ 컴파일러 인 RVCT3.1을 사용하고 있습니다. 또한 멀티 스레딩에서 발생할 수있는 문제를 추적하는 더 좋은 방법이 있습니까?

, 감사합니다

보리스

+0

주의 : 멀티 스레딩의 문제는 지연에 매우 민감하므로 heisenbugs에 문제가있을 수 있습니다. –

+0

Matthieu : 민감성을 알고 있지만 heisenbug는 무엇입니까? – BVB

+0

http://www.google.se/search?q=heisenbug – Macke

답변

2

내가 유사한 요구 사항을 가진 시스템 (ARM 임베디드 장치)와 함께 일했습니다. 처음부터 많은 것을 구축해야했지만, CodeWarrior를 사용하여 함수 이름 조회를위한 맵 파일을 사용했습니다.

CodeWarrior를 사용하면 각 함수의 시작과 끝 부분에 일부 코드를 삽입 할 수 있으며이를 사용하여 각 함수를 입력 할 때와 스레드를 전환 할 때를 추적 할 수 있습니다. 우리는 어셈블리를 사용했고, 그렇게해야 할 수도 있지만 생각보다 쉽습니다. 레지스터 중 하나가 16 진수 값인 반환 값이됩니다. 맵 파일로 컴파일하면 그 16 진수 값을 사용하여 해당 함수의 (맹 글링 된) 이름을 찾을 수 있습니다. 함수 이름에서 클래스 이름을 찾을 수 있습니다.

#####

왼쪽 기능 #####

체결 기능 : 기본적으로 자신에게 (이상적으로 바탕 화면) 어딘가에 스트림을 얻고, 스트림에 소리

하지만,

스레드로 전환 #

(PS - 당신이 실제로 문자를 보내려고하지 않기 때문에 실제 인코딩, 더 같은 1 21361987236, 2 1,238,721,312해야한다)

한 번에 하나의 스레드 만 처리하는 경우 이동 한 순서에 대한 정확한 기록을 제공해야합니다. 함수 프로파일 링을 위해 시계 틱 정보를 첨부하고, 할당 (및 할당 해제)을위한 메시지를 추가하면 메모리 추적을 얻습니다.

실제로 여러 스레드를 실행하는 경우 실제로 더 힘들어 지거나 그 이상이 될 수 있습니다. 잘 모르겠습니다. 모든 것에 타이밍 정보를 넣은 다음 각 스레드에 대해 별도의 스트림을 가지고 있습니다. 실행중인 프로세서를 감지하고 스레드를보고 할 수는 있지만 .... 그 중 어떤 프로세서가 작동하는지는 알 수 없습니다.

기본 아이디어는 다음과 같습니다. 각 단계 (기능 입력/종료, 스레드 전환 및 할당)에 대해보고 한 다음 처리 할 수있는 데스크톱 쪽에서 관심있는 정보를 다시 어셈블합니다.

+0

Narfanator : "각 코드의 시작과 끝 부분에 코드를 삽입하십시오"라는 말은 실제로 코드를 복사/붙여 넣기해야한다는 뜻입니까, 아니면 VC++에서와 같이 _penter 후크 기능과 비슷한 것을 사용할 수 있습니까? 또한 ARM이 매크로를 지원하는지 알고 있습니까? 누군가 내가 매크로에서 추적하고자하는 함수를 래핑해야한다고 제안했지만,이 솔루션은 프로젝트의 크기를 고려하면 상당히 지루합니다. – BVB

+1

아, 아니. 우리가 사용했던 코드 작성기는 컴파일러가 함수에 자동으로 추가 한 함수와 비슷한 코드 블록이었습니다. 우리는 의회에서 해냈어. 네가해야 할 것 같아.하지만 잘 모르겠다. 핵심은 재귀 때문에 함수 자체가 함수가 아니며 함수를 호출 할 수 없다는 것입니다. – Narfanator

+1

또한 우리는 C++가 아닌 모든 것을 C++로 작업했습니다. ARM은 ARM 어셈블리를 지원합니다. 이것은 컴파일러가 매크로 -> ARM 어셈블리를 지원하는지 여부에 따라 달라집니다. – Narfanator

1

gcc는 PRETTY_FUNCTION입니다.스레드와 관련하여 언제든지 gettid 또는 그와 비슷한 번호로 전화 할 수 있습니다.

+0

Drakosha : 유감스럽게도 유닉스 환경을 사용하지 않고 gcc를 사용할 수 없게됩니다. ( – BVB

1

스레드 수를 증가시키고 스레드 로컬 데이터에 저장하는 몇 가지 로그 시스템을 작성했습니다. 로그 문을 쓰는 데 도움이됩니다. (시간은 쉽게 출력됩니다)

추적을 위해 모두 함수 호출이 자동으로 수행됩니다. 확실하지 않습니다. 단지 몇 가지 경우라면, & 매크로를 쓰거나 __FUNCNAME__ #define (또는 컴파일러와 비슷한 것)을 사용하여 입/출력을 기록하는 매크로를 쉽게 작성할 수 있습니다.

관련 문제