質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

450閲覧

開発環境CLionを用いてデバッグしたところ関数へのステップインが動かずアセンブリで書かれているソースへ飛んでいってしまう

watarusugimoto

総合スコア47

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/12/24 21:21

関数へステップインしてくれない

CLionという開発環境を使用してC言語のソースコードを見ているのですが、mainからステップ実行していき、関数にさしかかった所でステップインしてその関数内での動きを見たいと考えました。
ブレークポイントを貼り、F8でステップオーバーしてカーソルを進めて、関数のところでF7ボタンを押し、関数の中身をステップ実行して行きたいと考えていますが、関数に差し掛かったところで、LKH(disassembly)というアセンブリ?のソースコードへ飛んでいってしまいます。

C言語に疎く良くわかっていないのですが、このようにステップ実行がすべての行追いかけてくれないことはC言語ではあるのでしょうか?
関数内へステップインしない原因が分かれば教えていただきたいです。

試したこと

コンパイルに最適化オプションがあることを知りました。
はじめ、CFLAGSの-Oが-3Oだったですが、最適化の影響で突然アセンブラのコードへ飛んでいってしまっているのかと思い、-Oへ変更してみましたが変化はありませんでした。

CLionはCMakeに対応しており、デバッグがMakefileのみでは出来なかったため、デバッグ用にCMakeList.txtを作りました。実行ファイルの場所を明示するためにCMakeList.txtは自作で作りました。その他は元から有るコードです。

環境

OS:Linux18.04.1 LTS
開発環境:CLion

LKH(disassembly)

C

1! [0x0000000000000000..0x000055959668a23f]: 2! not disassembled yet 3 4! [0x000055959668a240..0x000055959668a53f]: 5 push %rbp ! 0x000055959668a240 6 push %rbx ! 0x000055959668a241 7 sub $0x18,%rsp ! 0x000055959668a242 8 callq 0x55959668ec40 # <GetTime> ! 0x000055959668a246 9 mov 0x22d456(%rip),%rdx # 0x5595968b76a8 <FirstNode> ! 0x000055959668a24b 10 movsd %xmm0,(%rsp) ! 0x000055959668a252 11 mov %rdx,%rax ! 0x000055959668a257 12 nopw 0x0(%rax,%rax,1) ! 0x000055959668a25a 13 movq $0x0,0x68(%rax) ! 0x000055959668a260 14 movq $0x0,0x70(%rax) ! 0x000055959668a268 15 movq $0x0,0x60(%rax) ! 0x000055959668a270 16 movq $0x0,0x58(%rax) ! 0x000055959668a278 17 mov 0x50(%rax),%rax ! 0x000055959668a280 18 cmp %rax,%rdx ! 0x000055959668a284 19 jne 0x55959668a260 # <FindTour+32> ! 0x000055959668a287 20 mov 0x22d155(%rip),%ebp # 0x5595968b73e4 <Run> ! 0x000055959668a289 21 cmp $0x1,%ebp ! 0x000055959668a28f 22 je 0x55959668a9a0 # <FindTour+1888> ! 0x000055959668a292 23 mov 0x22d249(%rip),%r8d # 0x5595968b74e8 <MaxTrials> ! 0x000055959668a298 24 movabs $0x7fffffffffffffff,%rax ! 0x000055959668a29f 25 mov %rax,0x22d1a0(%rip) # 0x5595968b7450 <BetterCost> ! 0x000055959668a2a9 26 test %r8d,%r8d ! 0x000055959668a2b0 27 jle 0x55959668a988 # <FindTour+1864> ! 0x000055959668a2b3 28 mov 0x22d2e0(%rip),%rdi # 0x5595968b75a0 <HTable> ! 0x000055959668a2b9 29 callq 0x55959668fd80 # <HashInitialize> ! 0x000055959668a2c0 30 mov 0x22d21d(%rip),%ecx # 0x5595968b74e8 <MaxTrials> ! 0x000055959668a2c5 31 movl $0x1,0x22d2e3(%rip) # 0x5595968b75b8 <Trial> ! 0x000055959668a2cb 32 test %ecx,%ecx ! 0x000055959668a2d5 33 jle 0x55959668aa98 # <FindTour+2136> ! 0x000055959668a2d7 34 nopl (%rax) ! 0x000055959668a2dd 35 36 mov %r8d,0x22d084(%rip) # 0x5595968b753c <Hash> ! 0x000055959668a4b1 37 jne 0x55959668a490 # <FindTour+592> ! 0x000055959668a4b8 38 cmp %ecx,%esi ! 0x000055959668a4ba 39 jle 0x55959668a4c4 # <FindTour+644> ! 0x000055959668a4bc 40 mov %ecx,0x22d0f4(%rip) # 0x5595968b75b8 <Trial> ! 0x000055959668a4be 41 callq 0x55959669e6e0 # <ResetCandidateSet> ! 0x000055959668a4c4 42 mov 0x22cf80(%rip),%rax # 0x5595968b7450 <BetterCost> ! 0x000055959668a4c9 43 add $0x18,%rsp ! 0x000055959668a4d0 44 pop %rbx ! 0x000055959668a4d4 45 pop %rbp ! 0x000055959668a4d5 46 retq ! 0x000055959668a4d6 47 nopw 0x0(%rax,%rax,1) ! 0x000055959668a4d7 48 mov 0x22cc89(%rip),%rsi # 0x5595968b7170 <OrdinalTourCost> ! 0x000055959668a4e0 49 cmp %rbx,%rsi ! 0x000055959668a4e7 50 jg 0x55959668a38e # <FindTour+334> ! 0x000055959668a4ea 51 cmp %rdx,%rsi ! 0x000055959668a4f0 52 mov 0x22cfb7(%rip),%ecx # 0x5595968b74b0 <TraceLevel> ! 0x000055959668a4f3 53 jl 0x55959668a748 # <FindTour+1288> ! 0x000055959668a4f9 54 cmp $0x1,%ecx ! 0x000055959668a4ff 55 jle 0x55959668a407 # <FindTour+455> ! 0x000055959668a502 56 callq 0x55959668ec40 # <GetTime> ! 0x000055959668a508 57 subsd (%rsp),%xmm0 ! 0x000055959668a50d 58 mov 0x22d0a0(%rip),%esi # 0x5595968b75b8 <Trial> ! 0x000055959668a512 59 lea 0x23a89(%rip),%rdi # 0x5595966adfa8 ! 0x000055959668a518 60 mov %rbx,%rdx ! 0x000055959668a51f 61 mov $0x1,%eax ! 0x000055959668a522 62 andpd 0x230b1(%rip),%xmm0 # 0x5595966ad5e0 ! 0x000055959668a527 63 callq 0x5595966958e0 # <printff> ! 0x000055959668a52f 64 jmpq 0x55959668a407 # <FindTour+455> ! 0x000055959668a534 65 nopl 0x0(%rax) ! 0x000055959668a539 66 67! [0x000055959668a540..0xffffffffffffffff]: 68! not disassembled yet

Makefile

TREE_TYPE = TWO_LEVEL_TREE # TREE_TYPE = THREE_LEVEL_TREE # TREE_TYPE = ONE_LEVEL_TREE # CC = gcc IDIR = INCLUDE ODIR = OBJ CFLAGS = -O -Wall -I$(IDIR) -D$(TREE_TYPE) -g _DEPS = Delaunay.h GainType.h Genetic.h GeoConversion.h Hashing.h \ Heap.h LKH.h Segment.h Sequence.h gpx.h DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) _OBJ = Activate.o AddCandidate.o AddExtraCandidates.o \ AddTourCandidates.o AdjustCandidateSet.o AdjustClusters.o \ AllocateStructures.o Ascent.o \ Best2OptMove.o Best3OptMove.o Best4OptMove.o Best5OptMove.o \ BestKOptMove.o Between.o Between_SL.o Between_SSL.o \ BridgeGain.o BuildKDTree.o C.o CandidateReport.o \ ChooseInitialTour.o Connect.o CreateCandidateSet.o \ CreateDelaunayCandidateSet.o CreateNNCandidateSet.o \ Create_POPMUSIC_CandidateSet.o CreateQuadrantCandidateSet.o \ Delaunay.o Distance.o Distance_SPECIAL.o eprintf.o ERXT.o \ Excludable.o Exclude.o FindTour.o FixedOrCommonCandidates.o \ Flip.o Flip_SL.o Flip_SSL.o Forbidden.o FreeStructures.o \ fscanint.o Gain23.o GenerateCandidates.o Genetic.o \ GeoConversion.o GetTime.o GreedyTour.o Hashing.o Heap.o \ IsBackboneCandidate.o IsCandidate.o IsCommonEdge.o \ IsPossibleCandidate.o KSwapKick.o LinKernighan.o LKHmain.o \ Make2OptMove.o Make3OptMove.o Make4OptMove.o Make5OptMove.o \ MakeKOptMove.o MergeTourWithBestTour.o MergeWithTourIPT.o \ Minimum1TreeCost.o MinimumSpanningTree.o NormalizeNodeList.o \ NormalizeSegmentList.o OrderCandidateSet.o PatchCycles.o \ printff.o PrintParameters.o \ Random.o ReadCandidates.o ReadEdges.o ReadLine.o \ ReadParameters.o ReadPenalties.o ReadProblem.o RecordBestTour.o \ RecordBetterTour.o RemoveFirstActive.o \ ResetCandidateSet.o RestoreTour.o SegmentSize.o Sequence.o \ SFCTour.o SolveCompressedSubproblem.o \ SolveDelaunaySubproblems.o SolveKarpSubproblems.o \ SolveKCenterSubproblems.o SolveKMeansSubproblems.o \ SolveRoheSubproblems.o SolveSFCSubproblems.o SolveSubproblem.o \ SolveSubproblemBorderProblems.o SolveTourSegmentSubproblems.o \ Statistics.o StoreTour.o SymmetrizeCandidateSet.o \ TrimCandidateSet.o WriteCandidates.o WritePenalties.o \ WriteTour.o MergeWithTourGPX2.o gpx.o OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) $(ODIR)/%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) .PHONY: all clean all: $(MAKE) LKH LKH: $(OBJ) $(DEPS) $(CC) -o ../LKH $(OBJ) $(CFLAGS) -lm clean: /bin/rm -f $(ODIR)/*.o ../LKH *~ ._* $(IDIR)/*~ $(IDIR)/._*

CMakeList.txt

C

1cmake_minimum_required(VERSION 2.8.4) 2 3set(SOURCE_DIR "/home/wataru/workspace/LKH-2.0.9") 4set(PROJECT_BINARY_DIR "/home/wataru/workspace/LKH-2.0.9") 5 6set(IDIR "INCLUDE") 7set(TREE_TYPE "TWO_LEVEL_TREE") 8set(CMAKE_C_FLAGS "-O -Wall -I${IDIR} -D${TREE_TYPE} -g" ) 9 10# set project name 11project(LKH) 12 13add_custom_target(LKH COMMAND make -C ${SOURCE_DIR} CLION_EXE_DIR=${PROJECT_BINARY_DIR})

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

動作的に、ステップインはできています。
ステップイン先のソース・ファイルが見つからないため、逆アセンブリ結果を表示しているのだろうと思います。
多くのビルド・スクリプトはデバッガがソースを見つけることができるような構成でバイナリを出力しますが、少なくともLKHのmakefileはClionに対応していないということになります。

では、どうすればよいのか?が問題なのですが、ごめんなさい。私は LKHもCLionも使ったことがありません。ですので分かりません。
ただ、ご提示されているCMakeList.txtでやっているのは、単にmakeコマンドを発行しているだけですので、CLionが期待しているようなCMakeList.txtではない可能性があります。(ソース・ファイルの指定等がない)
CLionの設定で、既に存在するmakefileプロジェクトをインポートする方法がないか調べてみると何か分かるかも知れません。

投稿2018/12/25 10:06

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2018/12/25 11:06

ありがとうございます。 makefileを用いてターミナルからコンパイルし実行ファイルを作成しており、CMakeList.txtではCLionを用いてデバッグするために実行ファイルの場所をデバッガに伝えているという認識でいsた。 何か指定が存在するのかどうか、もう一度調べてみたいと思います。ありがとうございます。
guest

0

元のソースはhttp://akira.ruc.dk/~keld/research/LKH/からダウンロードできるもので間違いないでしょうか。

少なくとも、最適化なしのオプションは-Oではなく、-O0(オーゼロ)です。

投稿2018/12/25 00:38

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

watarusugimoto

2018/12/25 01:00

回答ありがとうございます。 上記からダウンロード出来るもので間違いありません。 -oにしてしまったのが原因かもしれませんので再度動作確認後コメントを入れさせて頂きます。 ありがとうございます。
watarusugimoto

2018/12/25 11:32

-O0(オーゼロ)へ変更して見たのですが、ステップイン出来ませんでした。 手探り状態ですが、もう少し試行錯誤してみたいと思います。 回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問