Weitere ähnliche Inhalte Ähnlich wie 20170527 inside .NET Core on Linux (20) Mehr von Takayoshi Tanaka (20) 20170527 inside .NET Core on Linux2. @tanaka_733
Red Hat K. K.
◦ .NET Core on RHEL, Red Hat on Azure, OpenShift
◦ SQL Server on RHEL も調べたり
Microsoft MVP for VSDT*
◦ .NET, C#, Azure系の勉強会によく出現します
◦ Build Insider でよく執筆しています (C# 文法, C# 7.0 や .NET Core)
◦ (需要があれば) ほかの勉強会にもお邪魔したいです
Contact
◦ contact@tanaka733.net or twitterで
2
* VSDT: Visual Studio and Development Technologies
3. AGENDA
.NET Core とは
◦ (この後出てくる) coreclr とか corefxが何かを知ってもらう
CoreFX on Linux
◦ ネットワーク通信とかファイルIOとかどう実装してるのか
Debugging .NET Core on Linux
◦ Visual Studioが使えないLinux上でどうやってデバッグするのか
3
4. …は話しません
Getting Started with .NET Core
◦ .NET Coreでのアプリ開発について
◦ 近々Build Insiderで連載が始まるので読んでね! ダイレクトマーケティング
Xamarin
◦ Xamarinの出自のmonoは関連が深いけれど、.NET Coreではないです
.NET Core 2.0/.NET Standard 2.0
◦ 2.0はpreview、現在の正式最新版が1.x
◦ 今日の話は.NET Core 1.xベース
◦ 概念としては2.0でも変わらない(予定)
◦ 利用可能なツールのバージョンとかオプションとかは変わるかも
4
7. .NET Core Inside
7
.NET Core App (C#/VB)
IL Assembly (exe, dll)
Roslyn
CoreFX
(.NET Core
Class Library)
ManagedUnmanaged
OS
Native ABI etc
(F#)
compiler
CoreCLR
(.NET Core Runtime)
.NET
Core
SDK
Tools
9. coreFX とは
.NET Core の基本クラスライブラリ群
◦コレクションとかIOとか
開発時、実行時ともライブラリとしてロードされる
◦開発時と実行時では参照するものが異なる 後で
NuGetとよばれるパッケージマネージャを通して提供
9
21. async on Linux
C# (5.0以降)では非同期処理の記述にasync/await構文が使えます
.NET ではasync/await構文の実装は単純なスレッドプールではないです
WindowsではIO完了ポートが使われています。では、Linuxは?
24
public async Task<string> GetExample()
{
var client = new HttpClient();
var res = await client.GetAsync("http://example.com");
return await res.Content.ReadAsStringAsync();
}
22. epoll for async in Linux
25
https://github.com/dotnet/corefx/blob/release/1.1.0/src/Nativ
e/Unix/System.Native/pal_networking.cpp
Linux では epoll が、 macOSではkqueueが使われています
25. LLDBを使ったデバッグ
起動中のプロセスにアタッチする場合
1. sosplugin のパスを探しておく 例:
/opt/dotnet/shared/Microsoft.NETCore.App/1.1.1/libsosplugin.so
2. アタッチ対象のPIDを取得
3. lldb起動
4. lldbコンソールでアタッチ
(lldb) process attach -p <PID>
5. プラグインロード
(lldb) plugin
load/opt/dotnet/shared/Microsoft.NETCore.App/1.1.1/libsosplugin.so
(lldb) setclrpath /opt/dotnet/shared/Microsoft.NETCore.App/1.1.1
(lldb) clrstack
26. LLDBを使ったデバッグ
出力されたcoreファイルにattachする場合
1. sosplugin のパスを探しておく 例:
/opt/dotnet/shared/Microsoft.NETCore.App/1.1.1/libsosplugin.so
2. gcore <PID> でcoreをはかせる
3. lldb起動
$ sudo lldb /opt/dotnet/dotnet --core <corefile>
4. プラグインロード
(lldb) plugin
load/opt/dotnet/shared/Microsoft.NETCore.App/1.1.1/libsosplugin.so
(lldb) setclrpath /opt/dotnet/shared/Microsoft.NETCore.App/1.1.1
(lldb) clrstack
29. perf ツール
1. 対象のPIDを取得
2. PERFを出力して表示する
$ sudo perf record -F 99 -p <PID> -a -g -- sleep 10
$ sudo perf report --stdio
32
33. High Level Debugging .NET Core
36
GDB/LLDB
MICore
MIDE/Engine.Impl
MIDE(*)/AD7.Impl
VSCode Debugger
AD7 Interface
*MIDE: MIDebugEngine
*vsdbgはVS製品以外での利用禁止かつ再頒布禁止なライセンス
MIText
VS Debugger
VS Debugger
Engine
vsdbg
(クローズド
ライセンス*)
windbg
統合可能
35. Visual Studio Codeからの
リモートデバッグ接続
.vscode/launch.json を編集する
◦ 通信コマンドを記述するので、sshコマンドのほかにdocker rshなども指定可能
38
{
"name": ".NET Core Docker Remote Attach",
"type": "coreclr",
"request": "attach",
“processId”: “86”, //アタッチするPIDを指定
"pipeTransport": {
"pipeProgram": “ssh",
“pipeArgs”: [ “-T”, “tanaka733@centos.example.com”], //接続先の指定
“quoteArgs”:false, //接続プログラムによりfalseがいいときとtrueがいいときがある
“debuggerPath”: “/opt/app-root/src/vsdbg/vsdbg”, //接続先のvsdbgパス
"pipeCwd": "${workspaceRoot}"
},
"sourceFileMap": {
"/opt/app-root/src": "${workspaceRoot}“
}
}
36. Visual Studio on Windowsからの
リモートデバッグ接続
リモート接続画面でSSHを選択する
◦ 設定が隠れているので、docker rshなどは現状指定できない
◦ docker for WindowsやAzure上のdockerコンテナへはVSの機能により接続可能
◦ つまり、Visual Studio拡張とかを書けば技術的にはいけるはず 調査中です…
あと今日見たら、プロトコルにWebSocketが追加されてたので夢は広がる?
39
38. 参考資料
GitHub repo
「NuGetでプラットフォーム毎にアセンブリを展開する方法」と「良い感じにコードを共有してプラット
フォーム別のアセンブリを作る方法」
P/Invokeを使って.NET Core on LinuxでGUIを作る記事 (英語)
◦ https://developers.redhat.com/blog/2016/09/14/pinvoke-in-net-core-rhel/
HttpClient
◦ https://github.com/dotnet/corefx/blob/release/1.1.0/src/System.Net.Http/src/System/Net/Http/HttpClient.cs
Staring.StartsWith の呼び出し階層 (StringクラスなどRuntime側でも必要なクラスはcorefxではなくcoreclrで定義
されている)
◦ https://github.com/dotnet/coreclr/issues/5612 (Issue本体)
◦ https://github.com/dotnet/coreclr/blob/release/1.1.0/src/mscorlib/src/System/String.Comparison.cs#L1104-L1114
◦ https://github.com/dotnet/coreclr/blob/release/1.1.0/src/mscorlib/src/System/Globalization/CompareInfo.cs#L582-L591
◦ https://github.com/dotnet/coreclr/blob/release/1.1.0/src/mscorlib/src/System/Globalization/CompareInfo.cs#L1346-L1351
◦ ※.NET Core 2.0で割と大掛かりに内部実装変わってます
41