Melt the butter in a large skillet over medium heat. Add the diced onion and cook until soft, about 5 minutes.
Stir in the minced garlic and ginger and cook for 1 minute until fragrant.
Add the chicken pieces to the skillet and cook until lightly browned on all sides, about 6 minutes.
Sprinkle in the garam masala, cumin, turmeric, chili powder, and salt. Stir to coat the chicken evenly.
Pour in the crushed tomatoes and bring the mixture to a simmer. Let it cook for 10 minutes, stirring occasionally.
Reduce the heat to low and stir in the heavy cream. Simmer gently for 5 more minutes until the sauce thickens slightly.
While the sauce simmers, rinse the basmati rice under cold water until the water runs clear. Place it in a saucepan with 2 cups of water and a pinch of salt. Bring to a boil, then cover and reduce to low heat. Cook for 15 minutes without lifting the lid.
Remove the rice from heat and let it rest covered for 5 minutes before fluffing with a fork.
Serve the butter chicken over the cooked basmati rice and top with chopped cilantro.